技术背景

一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到GPU的计算中。Jax除了支持GPU的张量运算,更重要的一个方面是Jax还支持谷歌自己的硬件TPU的张量运算。关于张量计算,可以参考前面写过的这一篇博客

而标题中的另外一个概念:Hamming Distance是用来衡量两个字符串之间的相似关系评分算法,如果两个字符串的所有元素完全相同,那么就会得到一个0的分数,如果两个长度各为100的字符串完全不相同(即每一个位置的字符都完全不同),那么得到的Hamming Distance就是100。而关于Normalized Hamming Distance的概念,则是为了使得结果更加的收敛,因此在Hamming Distance的基础之上再除以字符串的总长度,得到一个新的评分。举个例子说,BoyBob这两个字符串的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

参考链接

  1. https://www.analyticsvidhya.com/blog/2021/02/a-simple-guide-to-metrics-for-calculating-string-similarity/

使用jax加速Hamming Distance的计算的更多相关文章

  1. 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 ...

  2. LeetCode Total Hamming Distance

    原题链接在这里:https://leetcode.com/problems/total-hamming-distance/ 题目: The Hamming distance between two i ...

  3. hdu 4712 Hamming Distance(随机函数暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  4. 461. Hamming Distance(leetcode)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  5. [Swift]LeetCode461. 汉明距离 | Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  6. [Swift]LeetCode477. 汉明距离总和 | Total Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  7. Leetcode#461. Hamming Distance(汉明距离)

    题目描述 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意: 0 ≤ x, y < 231. 示例: 输入: x = ...

  8. HDU 4217 Hamming Distance 随机化水过去

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  9. Codeforces 608 B. Hamming Distance Sum-前缀和

      B. Hamming Distance Sum   time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. 带你掌握Vue过滤器filters及时间戳转换

    摘要:Vue的filters过滤器是比较常见的一个知识点,下面我将结合时间戳转换的例子带你快速了解filters的用法. 本文分享自华为云社区<三分钟掌握Vue过滤器filters及时间戳转换& ...

  2. I/O流中的字节流

    今天总结一下Java中重要的知识点I/O流,今天主要学习了字节流(自己的理解) 什么是I/O:我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出ou ...

  3. Jmeter扩展组件开发(6) - 将响应结果数据显示到查看结果树中

    CODE //用来存储响应数据,目的是将响应结果放到查看结果树当中private String resultData;/** 这个方法就是实现你具体功能逻辑的方法* @param javaSample ...

  4. Linux系列(24) - chmod

    前言 在Unix和Linux的中,每个文件(文件夹也被看作是文件)都有三种权限:读.写.运行. 被授予权限的用户身份有三种:当前文件的拥有者,与拥有者属于同组者(同一个group),其他人 hello ...

  5. windows 创建cmd alias

    windows cmd bat alias 命令 别名 1. 创建文件 C:\cmd-alias.bat @doskey sayhello=echo Hello $* @doskey cattxt=t ...

  6. cmake入门:01 构建一个简单的可执行程序

    一.目录结构 CMakeLists.txt:cmake 工程入口文件,包含当前目录下的工程组织信息.cmake 指令根据此文件生成相应的 MakeFile 文件. Hello.c: 源代码文件 bui ...

  7. PolarDB PostgreSQL 架构原理解读

    背景 PolarDB PostgreSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容PostgreSQL与Oracle.PolarDB 的存储与计算能 ...

  8. YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】

    正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/3 题目大意 \(S(i)\)表示\(i\)的约数个数,\(Q\)次询问给出\(n,m\)求 \ ...

  9. eclipse下载安装

    1.下载 网址:https://www.eclipse.org/downloads/ 找到:eclipse-inst-jre-win64.exe 下载... 2.安装 找到-->Eclipse ...

  10. Go语言之Goroutine与信道、异常处理

    一.Goroutine Go 协程可以看做成一个轻量级的线程,Go 协程相比于线程的优势: Goroutine 的成本更低大小只有 2 kb 左右,线程有几个兆. Goroutine 会复用线程,比如 ...