本文作者 Sebastian Kwiatkowski 介绍了使用 JavaScript 实现 GPU 加速神经网络的四个项目:deeplearn.js、Propel、gpu.js 和 Brain.js。
import * as dl from 'deeplearn'
const xs = inputXs.as4D(-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1)
const conv1Weights = dl.variable(
dl.randomNormal([FILTER_HEIGHT, FILTER_WIDTH, 1, NUMBER_FILTERS], 0, 0.1) as dl.Tensor4D)
const layer1 = dl.tidy(() => {
return xs.conv2d(conv1Weights, 1, 'same')
.relu()
.maxPool([2, 2], STRIDES, PADDING)
})
import * as pr from "propel"
export async function train(maxSteps = 0) {
const ds = pr.dataset("mnist/train").batch(128).repeat(100)
const exp = await pr.experiment("exp001")
for (const batchPromise of ds) {
const { images, labels } = await batchPromise
exp.sgd({ lr: 0.01 }, (params) =>
images.rescale([0, 255], [-1, 1])
.linear("L1", params, 200).relu()
.linear("L2", params, 100).relu()
.linear("L3", params, 10)
.softmaxLoss(labels))
if (maxSteps && exp.step >= maxSteps) break
}
}
import GPU from 'gpu.js'
const gpu = new GPU()
const multiplyMatrix = gpu.createKernel(function(a, b) {
var sum = 0;
for (var i = 0; i
sum += a[this.thread.y][i] * b[i][this.thread.x];
}
return sum;
}).setOutput([512, 512])
使用 gpu.js 进行矩阵乘法运算,相当于 GPU 编程中的 Hello World!
在当前语境中,内核是在 GPU 而不是 CPU 上执行的函数。使用 gpu.js,内核可以用 JavaScript 的子集(https://github.com/gpujs/gpu.js#creating-and-running-functions)编写。然后编译代码并在 GPU 上运行。几周前,gpu.js 支持基于 OpenCL 的 Node.JS(https://github.com/mikeseven/node-opencl/issues/55)。
数字和最多具有三维的数组被用作输入和输出。除了基本的数学运算之外,gpu.js 还支持局部变量、循环和 if/else 语句。
为了实现代码重用并允许更多模块化设计,你们可以注册自定义函数 ( https://github.com/gpujs/gpu.js#adding-custom-functions #),然后从内核代码中使用。
在内核的 JavaScript 定义中,this 对象提供线程标识符,并存储在实际内核里是常量、在外部是动态变量的值。
该项目专门研究加速 JavaScript 函数,并不试图提供神经网络框架。为此,我们可以求助一个依赖 gpu.js 的库。
Brain.js
Brain.js 继承自 harthur/brain(https://github.com/harthur/brain),一个可以回溯至 2010 年的 repo。
import brain from 'brain.js'
const network = new brain.recurrent.RNN()
const data = [
{input: [0, 0], output: [0]},
{input: [0, 1], output: [1]},
{input: [1, 0], output: [1]},
{input: [1, 1], output: [0]}
]
network.train(data)
共有近 30 人对这两个 repo 做出了贡献。
对 GPU 加速神经网络的支持基于 GPU.js,这可以算得上该项目近期最重要的进展了。
除了前馈网络之外,Brain.js 还包括三种重要 RNN 类型的实现(https://github.com/BrainJS/brain.js#neural-network-types):经典 Elman 网络、LSTM,以及具备门控循环单元的近期网络。
该 repo 包含的 demo 处于早期阶段。源代码中还有另外两个演示 ( https://github.com/BrainJS/brain.js/tree/develop/examples),其中一个 demo 涉及检测用 ASCII 码绘制的字符。
针对机器学习的加速 JavaScript 库有很多有趣的应用。
在线课程可以将与机器学习或 GPU 计算相关的练习直接集成到 web 应用程序中。学生不必跨不同的操作系统和软件版本去设置单独的开发环境。
许多基于神经网络的 demo 可以更容易地部署,并且不再需要服务器端 API。
对机器学习感兴趣的 JavaScript 开发者可以充分利用他们的专业技能,在集成问题上花费更少的时间。
此外,客户端上的可用计算资源应该被更好地利用。毕竟,并非所有的显卡都一直用于虚拟现实和挖矿。
需要说清楚,我现在并不主张将本文中提到的库用于任务关键型神经网络。Python 生态系统仍然是大多数应用程序的首选。
然而,过去 12 个月取得的进展确实令人鼓舞。一年前既没有 deeplearn.js,也没有 Propel。彼时 gpu.js repo 中的活动水平相对较低,Brain.js 也不支持 GPU 加速。
随着时间的推移,这些项目将在某些方面与已建立的框架发生竞争,并催生出 JavaScript 完美适合的全新应用。
https://towardsdatascience.com/gpu-accelerated-neural-networks-in-javascript-195d6f8e69ef
本文为机器之心编译,转载请联系本公众号获得授权。
------------------------------------------------
加入机器之心(全职记者/实习生):hr@jiqizhixin.com
广告&商务合作:bd@jiqizhixin.com
参与评论
手机查看
返回顶部