使用jax加速Hamming Distance的计算
技术背景
一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到GPU的计算中。Jax除了支持GPU的张量运算,更重要的一个方面是Jax还支持谷歌自己的硬件TPU的张量运算。关于张量计算,可以参考前面写过的这一篇博客。
而标题中的另外一个概念:Hamming Distance是用来衡量两个字符串之间的相似关系评分算法,如果两个字符串的所有元素完全相同,那么就会得到一个0的分数,如果两个长度各为100的字符串完全不相同(即每一个位置的字符都完全不同),那么得到的Hamming Distance就是100。而关于Normalized Hamming Distance的概念,则是为了使得结果更加的收敛,因此在Hamming Distance的基础之上再除以字符串的总长度,得到一个新的评分。举个例子说,Boy
和Bob
这两个字符串的Hamming Distance为1,而Normalized Hamming Distance为\(\frac{1}{3}\)。
Numpy和Jax代码实现
一般计算Hamming Distance可以通过scipy中自带的distance.hamming
来计算两个字符串之间的相似度,然而我们在日常的计算中更多的会把字符串转化成一个用数字来表示的数组,因此这里我们可以直接使用numpy的equal
函数之后在做一个sum
即可得到我们需要的Hamming Distance,如果再除以一个数组长度,那么就是Normalized Hamming Distance。由于Jax上实现了GPU版本的Numpy的函数,因此这里我们将Numpy的函数和Jax的函数写到一起来进行对比,尤其是时间上的一个衡量。这里测试的逻辑是:我们先通过Numpy来生成两个给定维度的随机数,然后将其转化成两个Jax格式的数组,然后分别对这两组不同格式的数组分别用Numpy和Jax计算Hamming Distance,最终统计多次运行所得到的时间。
# normalized_hamming_distance.py
import numpy as np
import jax.numpy as jnp
import time
if __name__ == '__main__':
np.random.seed(1)
length = 100000000
arr1 = np.random.randint(5, size=(length,),dtype=np.int32)
arr2 = np.random.randint(5, size=(length,),dtype=np.int32)
arr1_jax = jnp.array(arr1)
arr2_jax = jnp.array(arr2)
# Start Testing
time0 = time.time()
for _ in range(10):
nhd = np.sum(np.equal(arr1,arr2))/length
time1 = time.time()
for _ in range(10):
nhd_jax = jnp.sum(jnp.equal(arr1_jax,arr2_jax))/length
time2 = time.time()
# Result analysis
print ('The normalized hamming distance by numpy is: {}'.format(nhd))
print ('The normalized hamming distance by jax is: {}'.format(nhd_jax))
print ('The time cost by numpy is: {}s'.format(time1-time0))
print ('The time cost by jax is: {}s'.format(time2-time1))
输出结果如下所示:
The normalized hamming distance by numpy is: 0.20006858
The normalized hamming distance by jax is: 0.20006857812404633
The time cost by numpy is: 1.7030510902404785s
The time cost by jax is: 0.28351473808288574s
经过对比,我们发现Jax所实现的Numpy的GPU版本,可以在几乎不用改动接口的条件下,极大程度上的加速了Numpy的计算过程。
总结概要
本文通过对比Jax和Numpy计算Normalized Hamming Distance的过程来对比了Jax所实现的Numpy的GPU版本所带来的加速效果。实际上在维度比较小的时候,Numpy还是有非常轻量级的优势,此时GPU的加速效果并没有很好的体现出来。但是在规模较大的输入场景下,GPU的并行加速效果简直无敌,而且几乎没有改动原本Numpy的函数接口。除此之外,Jax作为一个函数式编程的端到端可微编程框架,支持jit、vmap、pmap和xmap等非常神奇的加速和并行化功能,为深度学习等领域提供了非常强有力的支持。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/jax-numpy.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
参考链接
使用jax加速Hamming Distance的计算的更多相关文章
- Codeforces Round #336 (Div. 2) B. Hamming Distance Sum 计算答案贡献+前缀和
B. Hamming Distance Sum Genos needs your help. He was asked to solve the following programming pro ...
- LeetCode Total Hamming Distance
原题链接在这里:https://leetcode.com/problems/total-hamming-distance/ 题目: The Hamming distance between two i ...
- hdu 4712 Hamming Distance(随机函数暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
- 461. Hamming Distance(leetcode)
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [Swift]LeetCode461. 汉明距离 | Hamming Distance
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [Swift]LeetCode477. 汉明距离总和 | Total Hamming Distance
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- Leetcode#461. Hamming Distance(汉明距离)
题目描述 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意: 0 ≤ x, y < 231. 示例: 输入: x = ...
- HDU 4217 Hamming Distance 随机化水过去
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- Codeforces 608 B. Hamming Distance Sum-前缀和
B. Hamming Distance Sum time limit per test 2 seconds memory limit per test 256 megabytes input ...
随机推荐
- Laravel [1045] Access denied for user 'homestead'@'localhost' .env没有配置
laravel 连接数据库出现错误 PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denied for use ...
- 怎么使用chrome浏览器查看内存是否有泄漏
一:什么是内存泄漏 javaScript会在创建变量时分配内存并且在不适用变量时会自动的释放内存,这个释放内存的过程极为垃圾回收,程序运行需要内存,只要程序提出要求操作系统或者运行时就必须提供内存,对 ...
- 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03
百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...
- Python实现一个简单三层神经网络的搭建并测试
python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...
- 踩坑系列《十二》解决连接云服务器的redis失败
在本地连接服务器redis的时候,发现连接失败,这是因为服务器上的redis开启保护模式运行,该模式下是无法进行远程连接的.只需要修改redis目录下的redis.conf文件,找到 protecte ...
- JVM学习笔记——GC算法
GC 算法 GC 即 Garbage Collection 垃圾回收.JVM 中的 GC 99%发生在堆中,而 Java 堆中采用的垃圾回收机制为分代收集算法.即将堆分为新生代和老年代,根据不同的区域 ...
- 极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务
仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...
- 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍
前言 本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...
- CTF入门记录(1
(https://ctf-wiki.org) 00 基础了解 CTF简介 (wolai.com) 00-1 CTF题目类型 Web 大部分情况下和网.Web.HTTP等相关技能有关. Web攻防的一些 ...
- Java多线程编程实战指南 设计模式 读书笔记
线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...