使用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 ...
随机推荐
- Jmeter系列(6)- 分析源码,创建登录、浏览商品接口请求
前言简介 接口的压力测试有个二八原则:线上80%的用户量在一天24小时20%(即4.8个小时)的时间里可以平稳运行,这个接口就算是通过压力测试了 源码分析 登录 浏览商品 创建请求 登录 浏览菜单 C ...
- react 的一些学习资料
* react开发实战 (Pro React) https://github.com/apress/pro-react * react 配置好的环境https://github.com/bricksp ...
- 检验appium环境是否正常:使用appium自动给手机安装app(注意:如果已存在该app,再执行会将原来的卸载再重装,需谨慎)
(注意:如果已存在该app,再执行会将原来的卸载再重装.泪的教训,我的微信被卸载重装了o(╥﹏╥)o,自动安装app这个步骤需谨慎操作) hi,前面几篇已经讲了appium环境的搭建.设备的连接, 那 ...
- [转载]ssh证书登录
转载链接 前言 本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的 ...
- 【Golang】三个点(...)用法
众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办? 这里的三个点(-),就给我们编程人员带来很大的灵活性,具体如下 在Golang中,三个点一共会用在四个地方(话说三个点 ...
- Serverless 对研发效能的变革和创新
作者 | 杨皓然(不瞋) 对企业而言,Serverless 架构有着巨大的应用潜力.随着云产品的完善,产品的集成和被集成能力的加强,软件交付流程自动化能力的提高,我们相信在 Serverless 架构 ...
- 题解 CF1103E Radix sum
题目传送门 题目大意 给出一个\(n\)个数的序列\(a_{1,2,..,n}\),可以选\(n\)次,每次可以选与上次选的相同的数,问对于\(\forall p\in[0,n-1]\)满足选出来的数 ...
- 题解 [HAOI2017]方案数
题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...
- 题解 SP6779 【GSS7 - Can you answer these queries VII】
题目传送门 题目大意 给出一个\(n\)个点的树,每个点有权值.有\(m\)次操作,每次要么查询一条链上的最大子段和,要么把一条链的权值都修改为一个常数. \(n,m\le 10^5\) 思路 如果是 ...
- 工作3年的Java程序员,轻松拿到阿里P6Offer,只因为他搞明白了Redis这几个问题!!
Redis中的多路复用模型 Redis6用到了多线程?那多线程应用在哪些地方,引入多线程后,又改如何保证线程安全性呢? 同时,如何在性能和线程安全性方面做好平衡? 关于Redis的单线程模型 在Red ...