Tinygrad – 不到1000行代碼實現(xiàn)的深度學(xué)習(xí)框架
推薦:用 NSDT設(shè)計器 快速搭建可編程3D場景。
顯然,Tinygrad似乎只是另一個深度學(xué)習(xí)框架。 嗯,不完全是。 它要比Pytorch更小和更簡單幾個數(shù)量級。 每個曾經(jīng)嘗試閱讀 PyTorch 或 TensorFlow 底層源代碼的人都會對此表示贊賞。 它無疑保證了添加更多加速器的門檻足夠低。
由于tinygrad極其簡單,它的目標(biāo)是成為添加新加速器的最簡單的框架,并支持推理和訓(xùn)練。
這個名字從何而來?
tinygrad 將始終低于 1000 行。 如果不是,我們將恢復(fù)提交,直到tinygrad變得更小。
我認(rèn)為這有點過于雄心勃勃,除非你將其分成各種包來添加各種支持,例如各種加速器、模型結(jié)構(gòu)、配置文件和加載器等等。 但是,是的,這聽起來確實很有趣。
加速的內(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 無疑在神經(jīng)網(wǎng)絡(luò)訓(xùn)練領(lǐng)域占據(jù)主導(dǎo)地位。 因此,看到加速器支持使用 OpenCL 是一個很好的改變。 那么,這真的是 GPU 特定的嗎? 不,某些 CPU 也支持 OpenCL 的某些子集(例如通過 pocl)。 使用 OpenCL 的有趣之處在于支持完全不同的硬件來加速訓(xùn)練或推理,例如 FPGA。 如果我沒記錯的話,英特爾的一些 FPGA 可以使用 OpenCL 進(jìn)行編程。 然而,我不確定 JIT 編譯的 PyOpenCL 內(nèi)核如何容易地轉(zhuǎn)換為編程的輸入,例如 FPGA(如果它們不提供任何 OpenCL 功能)。
然而,似乎添加了通過 PyCUDA 的 CUDA 支持,但尚未集成。
- ANE(蘋果神經(jīng)引擎)
張量類似乎支持一些 ANE 操作。 他們似乎正在構(gòu)建自己的 ANE 抽象層,以利用 ANE 進(jìn)行培訓(xùn)。
3、tinygrad上手試用
注意! 如果我們在 conda 環(huán)境中使用tinygrad,那么我們必須安裝 OpenCL 實現(xiàn)(例如 pocl)
conda install -c conda-forge pocl pyopencl clinfo
clinfo 對于列出可用的 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)
這是一個快速 DNN 推理示例:
ipython3 examples/efficientnet.py https://media.istockphoto.com/photos/hen-picture-id831791190
看來 export GPU=1 終于可以體驗到一些加速了。
使用 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é)束語
Tinygrad 確實還不夠成熟。 然而,我想最好讓每個人自己來決定tinygrad是一個笑話還是在一個過于復(fù)雜的深度學(xué)習(xí)框架的世界中迫切需要的東西。
原文鏈接:http://www.bimant.com/blog/tinygrad-dl-framework/