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