Tinygrad – 不到1000行代碼實(shí)現(xiàn)的深度學(xué)習(xí)框架
推薦:用 NSDT設(shè)計(jì)器 快速搭建可編程3D場(chǎng)景。
顯然,Tinygrad似乎只是另一個(gè)深度學(xué)習(xí)框架。 嗯,不完全是。 它要比Pytorch更小和更簡(jiǎn)單幾個(gè)數(shù)量級(jí)。 每個(gè)曾經(jīng)嘗試閱讀 PyTorch 或 TensorFlow 底層源代碼的人都會(huì)對(duì)此表示贊賞。 它無(wú)疑保證了添加更多加速器的門(mén)檻足夠低。
由于tinygrad極其簡(jiǎn)單,它的目標(biāo)是成為添加新加速器的最簡(jiǎn)單的框架,并支持推理和訓(xùn)練。
這個(gè)名字從何而來(lái)?
tinygrad 將始終低于 1000 行。 如果不是,我們將恢復(fù)提交,直到tinygrad變得更小。
我認(rèn)為這有點(diǎn)過(guò)于雄心勃勃,除非你將其分成各種包來(lái)添加各種支持,例如各種加速器、模型結(jié)構(gòu)、配置文件和加載器等等。 但是,是的,這聽(tīng)起來(lái)確實(shí)很有趣。
加速的內(nèi)容已經(jīng)移入 Accel。
1、tinygrad代碼結(jié)構(gòu)
pyreverse --filter-mode ALL --colorized --max-color-depth 7 --output webp ./tinygrad/
輸出以下代碼結(jié)構(gòu):
2、加速器的使用
- GPU
NVIDIA 的 CUDA 無(wú)疑在神經(jīng)網(wǎng)絡(luò)訓(xùn)練領(lǐng)域占據(jù)主導(dǎo)地位。 因此,看到加速器支持使用 OpenCL 是一個(gè)很好的改變。 那么,這真的是 GPU 特定的嗎? 不,某些 CPU 也支持 OpenCL 的某些子集(例如通過(guò) pocl)。 使用 OpenCL 的有趣之處在于支持完全不同的硬件來(lái)加速訓(xùn)練或推理,例如 FPGA。 如果我沒(méi)記錯(cuò)的話(huà),英特爾的一些 FPGA 可以使用 OpenCL 進(jìn)行編程。 然而,我不確定 JIT 編譯的 PyOpenCL 內(nèi)核如何容易地轉(zhuǎn)換為編程的輸入,例如 FPGA(如果它們不提供任何 OpenCL 功能)。
然而,似乎添加了通過(guò) PyCUDA 的 CUDA 支持,但尚未集成。
- ANE(蘋(píng)果神經(jīng)引擎)
張量類(lèi)似乎支持一些 ANE 操作。 他們似乎正在構(gòu)建自己的 ANE 抽象層,以利用 ANE 進(jìn)行培訓(xùn)。
3、tinygrad上手試用
注意! 如果我們?cè)?conda 環(huán)境中使用tinygrad,那么我們必須安裝 OpenCL 實(shí)現(xiàn)(例如 pocl)
conda install -c conda-forge pocl pyopencl clinfo
clinfo 對(duì)于列出可用的 OpenCL 設(shè)備很有用,但它需要安裝在 conda 環(huán)境中。
如果我們使用標(biāo)準(zhǔn)示例,我們可以看到有 CPUBuffer 和 GPUBuffer:
from tinygrad.tensor import Tensor(Tensor.ones(5000,5000).gpu() Tensor.ones(5000,5000).gpu()).cpu()
輸出如下:
<Tensor CPUBuffer([[2., 2., 2., ..., 2., 2., 2.], [2., 2., 2., ..., 2., 2., 2.], [2., 2., 2., ..., 2., 2., 2.], ..., [2., 2., 2., ..., 2., 2., 2.], [2., 2., 2., ..., 2., 2., 2.], [2., 2., 2., ..., 2., 2., 2.]], dtype=float32) with grad None>
然而:
from tinygrad.tensor import TensorTensor.ones(5000,5000).gpu() Tensor.ones(5000,5000).gpu())
輸出:
<Tensor <GPUBuffer with shape (5000, 5000)> with grad None>
如果導(dǎo)出 PYOPENCL_COMPILER_OUTPUT=1,PyOpenCL 將顯示編譯器警告:
CompilerWarning: Built kernel retrieved from cache. Original from-source build had warnings:Build on <pyopencl.Device 'Intel(R) Iris(R) Xe Graphics [0x9a49]' on 'Intel(R) OpenCL HD Graphics' at 0x562deb03ccb0> succeeded, but said:1:1:112: warning: double precision constant requires cl_khr_fp64, casting to single precisioninline float get_A(__global const float *x, int gid) { int valid = 1; int idx = gid; ; return valid ? x[idx] : 0.0;} ^1:2:112: warning: double precision constant requires cl_khr_fp64, casting to single precisioninline float get_B(__global const float *x, int gid) { int valid = 1; int idx = gid; ; return valid ? x[idx] : 0.0;}inline float _ewop(int gid,float acc,__global const float *A_g,__global const float *B_g) {float A = get_A(A_g, gid); ^1:4:19: warning: double precision constant requires cl_khr_fp64, casting to single precision float acc = 0.0; ^ warn(text, CompilerWarning)
這是一個(gè)快速 DNN 推理示例:
ipython3 examples/efficientnet.py https://media.istockphoto.com/photos/hen-picture-id831791190
看來(lái) export GPU=1 終于可以體驗(yàn)到一些加速了。
使用 Intel i7-1165G7 的結(jié)果:
8 8.045593 hendid inference in 1.10 s
使用 GPU 加速:
8 8.0455885 hendid inference in 0.31 s
4、結(jié)束語(yǔ)
Tinygrad 確實(shí)還不夠成熟。 然而,我想最好讓每個(gè)人自己來(lái)決定tinygrad是一個(gè)笑話(huà)還是在一個(gè)過(guò)于復(fù)雜的深度學(xué)習(xí)框架的世界中迫切需要的東西。
原文鏈接:http://www.bimant.com/blog/tinygrad-dl-framework/