本書帶領(lǐng)讀者手把手實現(xiàn)深度學(xué)習(xí)推理框架,并支持大語言模型的推理。
全書共 9 章,以實現(xiàn)開源深度學(xué)習(xí)推理框架 KuiperInfer 為例,從基礎(chǔ)的張量設(shè)計入手,逐步深入講 解計算圖、核心算子等關(guān)鍵模塊的設(shè)計與實現(xiàn)。最后,書中還涵蓋了如何支持深度學(xué)習(xí)模型如 ResNet、 YOLOv5,以及大語言模型 Llama 2 的推理。通過本書,讀者不僅能夠獲得構(gòu)建和優(yōu)化深度學(xué)習(xí)推理框架 的實踐經(jīng)驗,還能深入理解框架的內(nèi)部機(jī)制。
本書面向深度學(xué)習(xí)初學(xué)者、希望進(jìn)一步了解深度學(xué)習(xí)推理框架的開發(fā)者,以及其他對相關(guān)內(nèi)容感興趣 的 AI 從業(yè)者。
【簡單學(xué)】8000 多行代碼即可從零實現(xiàn)深度學(xué)習(xí)推理框架
【透徹學(xué)】透明解析推理框架內(nèi)部機(jī)制,不再是黑盒工具
【輕松學(xué)】附贈 B 站免費配套視頻,附贈本書配套源代碼
【一起學(xué)】基于 GitHub 2.7k 星標(biāo)開源項目 KuiperInfer
【多模型】支持 ResNet、YOLOv5,支持 Llama 等大模型推理
傅莘莘 深度學(xué)習(xí)算法工程師,擅長軟件系統(tǒng)設(shè)計、C 和人工智能混合項目的開發(fā)。 代表作:KuiperInfer,https://github.com/zjhellofss/KuiperInfer,也就是本書的藍(lán)本項目,多次上榜Github中文項目趨勢榜。本課程的配套視頻在Bilibili平臺已經(jīng)累計斤10萬次播放:https://space.bilibili.com/1822828582。
第 1 章 深度學(xué)習(xí)推理框架基礎(chǔ)
1.1 推理框架概覽
1.1.1 什么是深度學(xué)習(xí)推理框架
1.1.2 代表性深度學(xué)習(xí)推理框架
1.2 KuiperferIn 簡介
1.2.1 KuiperInfer 的組成部分
1.2.2 KuiperInfer 的設(shè)計原則
1.3 環(huán)境配置與依賴安裝
1.3.1 數(shù)學(xué)庫的安裝
13.2 對數(shù)學(xué)庫的測試
1.3.3 單元測試庫 Google Test 的安裝與配置
1.3.4 日志庫的安裝
1.4 集成開發(fā)環(huán)境:CLion
1.4.1 在 CLion 中查看文件
1.4.2 使用 CLion 進(jìn)行單元測試
1.5 集成開發(fā)環(huán)境:VSCode
1.6 小結(jié)
1.7 練習(xí)
第 2 章 張量的設(shè)計
2.1 張量是什么
2.1.1 張量的維度
2.1.2 張量中的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
2.1.3 張量中的數(shù)據(jù)存儲順序
2.1.4 Cube 中的數(shù)據(jù)排布
2.2 如何實現(xiàn)張量
2.2.1 實現(xiàn)張量的定義
2.2.2 創(chuàng)建新張量
2.2.3 張量的填充
2.2.4 改變張量的形狀
2.2.5 張量的工具類方法
2.3 單元測試
2.3.1 創(chuàng)建數(shù)據(jù)容器
2.3.2 創(chuàng)建一維張量
2.3.3 創(chuàng)建三維張量
2.3.4 獲取張量的形狀
2.3.5 判斷張量是否為空
2.3.6 獲取張量中某個位置的元素
2.4 小結(jié)
2.5 練習(xí)
第 3 章 計算圖的設(shè)計
3.1 計算圖是什么
3.2 PNNX 計算圖的轉(zhuǎn)換
3.2.1 將 PyTorch 模型轉(zhuǎn)換為 TorchScript 模型
3.2.2 將 TorchScript 模型轉(zhuǎn)換為 PNNX 格式的計算圖
3 .3 PNNX 計算圖結(jié)構(gòu)
3.3.1 結(jié)構(gòu)詳解
3.3.2 加載模型結(jié)構(gòu)定義文件
3.3.3 計算節(jié)點
3.3.4 操作數(shù)
3.3.5 參數(shù)和權(quán)重
3.4 KuiperInfer 計算圖結(jié)構(gòu)
3.4.1 對操作數(shù)的封裝
3.4.2 對權(quán)重類的封裝
3.4.3 對計算節(jié)點的提取和封裝
3.4.4 對參數(shù)的提取和封裝
3.4.5 KuiperInfer 計算圖的整體結(jié)構(gòu)
3.5 單元測試
3.5.1 測試模型的加載
3.5.2 測試 PNNX 中的計算節(jié)點
3.5.3 測試 PNNX 中的操作數(shù)
3.5.4 測試 PNNX 計算節(jié)點的權(quán)重
3.6 小結(jié)
3.7 練習(xí)
第 4 章 計算圖的構(gòu)建
4.1 計算節(jié)點的執(zhí)行順序
4.2 拓?fù)渑判?br />
4.2.1 基于深度優(yōu)先的拓?fù)渑判?br />
4.2.2 拓?fù)渑判虻膶崿F(xiàn)思路
4.2.3 構(gòu)建之間的節(jié)點圖關(guān)系
4.2.4 拓?fù)渑判虻木幊虒崿F(xiàn)
4.2.5 延伸:基于廣度優(yōu)先的拓?fù)渑判?br />
4.3 構(gòu)建計算圖的流程
4.3.1 狀態(tài)檢查
4.3.2 計算節(jié)點數(shù)據(jù)空間的初始化
4.3.3 整體構(gòu)建流程
4.4 單元測試
4.4.1 拓?fù)渑判驕y試
4.4.2 計算圖狀態(tài)變化測試
4.4.3 輸出空間初始化測試
4.5 小結(jié)
4.6 練習(xí)
第 5 ?e 算子和算子注冊器的設(shè)計與實現(xiàn)
5.1 什么是算子
5.2 算子類及其實現(xiàn)
5.2.1 算子類中的成員變量
5.2.2 算子類中的成員方法
5.2.3 算子類與計算節(jié)點
5.3 算子的全局注冊器
5.3.1 全局注冊器的設(shè)計方法與實現(xiàn)
5.3.2 向注冊器中注冊算子的實例化方法
5.3.3 從注冊器中獲取算子類的實例化方法
5.3.4 注冊算子的工具類
5.4 算子的實例化方法
5.4.1 算子實例化的時機(jī)
5.4.2 編寫第一個算子 ReLU
5.4.3 注冊 ReLU 算子
5.5 單元測試
5.5.1 驗證全局注冊器的唯一性
5.5.2 將實例化方法插入全局注冊器
5.5.3 獲取算子
5.5.4 驗證 ReLU 算子的功能
5 .6 小結(jié)
5.7 練習(xí)
第 6 章 池化算子和卷積算子的實現(xiàn)
6.1 池化算子
6.1.1 簡介
6.1.2 池化操作中的邊界填充
6.1.3 多通道輸入特征圖的池化
6.1.4 池化算子的實現(xiàn)
6.1.5 池化算子的注冊
6.2 卷積算子
6.2.1 簡介
6.2.2 卷積的直觀解釋
6.2.3 用 Im2Col 優(yōu)化卷積計算
6.2.4 Im2Col 方法的實現(xiàn)
6.2.5 卷積算子的計算過程
6.2.6 卷積算子中的 GEMM 實現(xiàn)
6.2.7 卷積算子的注冊和實例化方法
6.3 單元測試
6.3.1 池化算子的相關(guān)測試
6.3.2 卷積算子的相關(guān)測試
6.4 小結(jié)
6.5 練習(xí)
第 7 章 表達(dá)式算子的實現(xiàn)
7.1 表達(dá)式和表達(dá)式算子的定義
7.2 詞法分析
7.2.1 詞法分析的定義
7.2.2 詞法分析的過程
7.3 語法分析
7.3.1 語法二叉樹結(jié)構(gòu)
7.3.2 遞歸的條件
7.3.3 遞歸向下構(gòu)建語法二叉樹
7.3.4 對語法二叉樹進(jìn)行轉(zhuǎn)換
7.3.5 逆波蘭表達(dá)式
7.4 表達(dá)式算子的實現(xiàn)過程
7.4.1 實例化
7.4.2 類定義
7.4.3 注冊
7.4.4 對 Forward 方法的重寫
7.4.5 計算相關(guān)代碼的實現(xiàn)
7.5 單元測試
7.5.1 詞法分析測試
7.5.2 逆波蘭表達(dá)式的生成測試
7.5.3 表達(dá)式計算過程測試
7.6 小結(jié)
7.7 練習(xí)
第 8 章 支持 ResNet 和 YOLOv5 推理
8.1 模型的執(zhí)行方法
8.1.1 執(zhí)行輸入類計算節(jié)點
8.1.2 執(zhí)行常規(guī)類計算節(jié)點
8.1.3 獲取模型的輸出
8.2 在 KuiperInfer 中支持 ResNet
8.2.1 全連接算子的實例化
8.2.2 全連接算子的實現(xiàn)
8.2.3 ResNet 推理流程概覽
8.2.4 實現(xiàn) KuiperInfer 對 ResNet支持 的
8.3 在 KuiperInfer 中支持 YOLOv5
8.3.1 數(shù)據(jù)預(yù)處理
8.3.2 補(bǔ)充缺失的算子
8.3.3 YOLOv5 模型的導(dǎo)出和運行
8.3.4 YOLOv5 模型輸出的后處理
8.4 小結(jié)
8.5 練習(xí)
第 9 章 支持大語言模型的推理
9.1 大模型簡介
9.1.1 Transformer 模型
9.1.2 GPT 模型
9.2 大模型的架構(gòu)
9.2.1 輸入嵌入
9.2.2 位置編碼
9.2.3 自注意力機(jī)制
9.2.4 前饋神經(jīng)網(wǎng)絡(luò)層
9.2.5 鍵?C值對緩存
9.2.6 殘差連接與層歸一化
9.2.7 解碼
9.3 Llama 2 的關(guān)鍵實現(xiàn)
9.3.1 均方根歸一化
9.3.2 自注意力機(jī)制
9.3.3 前饋神經(jīng)網(wǎng)絡(luò)層
9.3.4 Transformer 層
9.3.5 完整的 Transformer 解碼器
9.4 KuiperInfer 支持 Llama 2 推理
9.4.1 加載模型文件
9.4.2 模型的推理
9.4.3 結(jié)果解碼
9.4.4 大模型推理基礎(chǔ)算子的實現(xiàn)
9.4.5 推理演示
9.5 小結(jié)