Pytorch的一小步,昇騰芯片的一大步
相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持華為昇騰芯片!
1、 發生了什么事兒?
在2023年10月4日PyTorch 2.1版本的發布博客上,PyTorch介紹的beta版本新特性上有一個PRIVATEUSE1
特性是提高了第三方設備的支持,并說明了華為Ascend NPU(昇騰NPU芯片)的OSS小組已經成功將torch_npu整合進入PyTorch;
人話就是: pytorch原生支持的是CPU和CUDA,現在昇騰NPU也可以支持pytorch了;
-
**PyTorch2.1 發布了
PRIVATEUSE1
新特性,PyTorch介紹的beta版本PRIVATEUSE1
新特性,**主要目標是讓PyTorch可以使用更多的硬件; -
PyTorch 2.1對華為昇騰芯片NPU的支持:簡單理解就是華為的Ascend NPU(昇騰NPU芯片)的OSS小組通過PyTorch的
PRIVATEUSE1
特性讓PyTorch可以在華為的NPU芯片上運行
1.1 PyTorch的PRIVATEUSE1特性是什么?
- PyTorch不是一個完全的前后端分離的架構,但是可以從前后端分離的角度理解,其中前端負責用戶交互,而后端處理計算任務;
- PyTorch的前端:主要有兩個,一是Python前端:另一個是C++前端; Python前端是主要的接口,而C++前端為PyTorch機器學習框架提供了純C++接口; Python API底層是基于C++代碼庫,提供了諸如張量和自動微分等基礎數據結構和功能;
- PyTorch的后端:指的是執行前端定義操作的計算引擎。PyTorch支持多種后端,每種后端都針對特定的硬件或運行時進行了優化。例如,它有針對CUDA、cuDNN、MKL、MKLDNN、OpenMP等的后端。這些后端控制操作的行為,并且對于利用諸如GPU計算之類的硬件加速至關重要;
- PyTorch還允許自定義后端,用戶可以使用torch.compile定義自己的后端。在追蹤FX圖后,可以通過TorchDynamo(torch.compile的圖追蹤組件)調用自定義后端中的后端函數;
PRIVATEUSE1
特性就是PyTorch提供的一種定制后端的機制,主要是為了幫助開發者在PyTorch中集成新的計算后端,PRIVATEUSE1特性為集成新的計算后端提供了一個結構化的方法。通過此特性,開發者可以將特定于硬件的優化和實現集成到PyTorch中,從而獲得更好的性能,特別是在針對特定硬件加速器(如GPU、NPU或FPGA)時;- 簡單理解就是華為的Ascend NPU(昇騰NPU芯片)的OSS小組通過PyTorch的
PRIVATEUSE1
特性讓PyTorch可以在華為的NPU芯片上運行。
1.2、 PyTorch2.1在華為NPU運行方式
參考官網,非常簡單,代碼如下:
torch.rename_privateuse1_backend("my_hardware_device")
torch.utils.generate_methods_for_privateuse1_backend()
x = torch.randn((2, 3), device='my_hardware_device')
y = x + x # run add kernel on 'my_hardware_device'
雖然通過插件(之前昇騰自己fork維護的)的形式官方支持了第三方硬件NPU,還有個極大的問題,我們可以看看PyTorch Adapter,版本配套關系及其離譜,就支持了三個pytorch版本,版本配套表一個電腦屏幕都放不下,昇騰在面向開發者文檔上還是要多下功夫啊,感覺是研發根據自己的開發環境寫的文檔,和mindspore文檔一樣的問題(改天有時間再寫),對于一個開發者文檔是相當重要的,新手直接勸退…
另外,有意思的是,這個Pytorch Adapter在gitee上也開源了,但是文檔不是同步更新,且內容邏輯是不一樣的,大家可以去查查看;
gitee上的:PyTorch與Python版本配套表
PyTorch版本 | Python版本 |
---|---|
PyTorch1.8.1 | Python3.7.x(3.7.5及以上)、Python3.8.x、Python3.9.x |
PyTorch1.11.0 | Python3.7.x(3.7.5及以上)、Python3.8.x、Python3.9.x、Python3.10.x |
PyTorch2.0.1 | Python3.8.x、Python3.9.x、Python3.10.x |
github上的:版本配套表
PyTorch Version | Python Version |
---|---|
PyTorch1.8.1 | Python3.7.x(>=3.7.5),Python3.8.x,Python3.9.x |
PyTorch1.11.0 | Python3.7.x(>=3.7.5),Python3.8.x,Python3.9.x,Python3.10.x |
PyTorch2.0.1 | Python3.8.x,Python3.9.x,Python3.10.x |
PyTorch2.1.0 | Python3.8.x,Python3.9.x,Python3.10.x |
2、 對pytorch和第三方芯片廠商(昇騰)有啥好處?
2.1 是原生支持了昇騰嗎?
先通過【paperwithcode】看下目前市場上論文基于不同AI框架實現的框架占比情況來看,Pytorch依舊是作為一哥的存在;并且底層硬件基本都是英偉達,那么如果一個新硬件廠商想要支持Pytorch如何做呢?
我們先看看特斯拉咋做的:
正常來說:
1、 通過ONNX/torchscript作為中轉來實現插件,但對于優化和開發效率有極大的影響;
2、 fork下pytorch,適配自己的硬件后并持續維護,但大家要知道Pytorch是按月發版本的,客戶無法使用新特性,那硬件廠商的適配要吐血。。。
兩種方式都會讓使用新硬件的客戶抓狂,那此次特性的更新,對于昇騰來說,其實是利好的,pytorch增加了PrivateUse1
特性,相當于不用fork了!
但我們得看下其實也不是算原生支持,其實從1.1、1.2 的描述來看,pytorch增加了PrivateUse1
特性,這樣做可以降低對新硬 XPU 件的支持門檻,而PyTorch在做前后端做進一步的分離,以支持多硬件時代,芯片廠商實現后端后可以無縫切換;
為了驗證這個功能呢,華為昇騰pytorch團隊基于自己維護的torch_npu
項目做了個新的后端,并且成功在torch 2.1中調用昇騰的npu;
注:彩蛋
GRAPHCORE發了一個PR(來源)增加IPU專用的DispatchKey通過了,有趣的是,一個多月后,昇騰希望在pytorch中加入NPU專用的DispatchKey(來源),但pytorch團隊以PrivateUse1
特性馬上要支持了為由給拒絕了,昇騰還是慢了些啊,估計好氣啊。。。
注:GRAPHCORE:擬未是一家人工智能芯片公司,為人工智能打造計算機系統,這些系統由先進的智能處理器(IPU)提供動力,旨在滿足人工智能獨特的計算要求。2016年,公司正式成立,總部位于英國布里斯托。2019年,公司在北京設立公司中國總部,并確定中文名“擬未”。目前,擬未已經設立了北京、上海、深圳和新竹辦公室。
2.2對于pytorch的好處和挑戰是什么?
- 好處:
進一步穩固pytorch的大哥的市場地位,難以撼動,pytorch本身也希望屏蔽硬件的差異,估計希望做到所有用戶的一套代碼對底層硬件無感知;估計后續pytorch的設備列表會越來越長…
- 挑戰:
拋開對第三方硬件的支持這個特性,LLM領域對pytorch的沖擊還是有的,當前pytorch對分布式訓練的支持…
目前大廠都是pytorch+DeepSpeed/Megatron三件套在玩,大模型時代的對并行框架的需求已經是必需品了,如果只是一個pytorch那在LLM時代是沒有意義的;
等等,喲,昇騰有AscendSpeed,據我所知MindSpore是把并行能力集成到框架本身,那么AscendSpeed就是DeepSpeed/Megatron等并行框架的插件咯,和適配pytorch是一個套路;好像也是沒辦法的辦法~
2.3 對于第三方芯片廠商(昇騰)有的好處和挑戰是什么?
- 好處:
對于pytorch來說是一小步,對于昇騰來說,解決了NPU支持pytorch的問題,算是生態上一大步,早就受不了第三方硬件上pytorch的各種適配和極低的開發效率;
- 挑戰:
但torch_npu
插件不是原生支持,會有幾個較大的挑戰:
1、版本更新:面對每季度release的pytorch,插件跟不上可能存在版本兼容性問題;
2、 第三方extension支持: 很多基于 torch 開發的項目本身也是一個 extension,默認一般都會有 CUDA 的支持,有的會有 CPU 的支持。也需要為新的硬件添加相應的kernel,可能的形式是做一個插件的插件,e.g. torchvision-xpu等等。如果前端 API 用法有些和 torch 不匹配的地方還要有自己的 modelzoo;
3、 **Test Coverage 的問題:**torch 本身的測試項目很多的,默認的測試不會跑非原生的 device,要保障質量是有一定難度的,畢竟 torch 用戶那么多迭代了這么久才到現在的地步;
4、 LLM支持:大模型的爆發式增長,對新硬件的底層算子的支持有新的需求,如flashattension等大算子的支持,今天有flashattention,明天如果有另外一個算子的,昇騰還是要補齊基礎算子的基礎上,基于生態構建基于昇騰的優勢算子,但昇騰的設備又沒有2C端,終究在廣大開發者生態上慢英偉達一拍。
加油啊,昇騰、加油啊dojo、加油啊~
天下苦英偉達久矣~
參考
1、 https://www.zhihu.com/question/624955377/answer/3239829901
2、 https://gitee.com/ascend/pytorch