精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一個簡單模型就讓ChatGLM性能大幅提升 | 最“in”大模型

英特爾中國 ? 來源:未知 ? 2023-08-19 11:15 ? 次閱讀

引言

自大語言模型 (LLM) 成為熱點話題以來,涌現了一大批中文大語言模型并在優化平臺中得到了積極部署。ChatGLM 正是廣受好評的主流中文 LLM 之一。然而,由于 ChatGLM 模型尚未成為 Transformer 生態的原生模型,因此,官方 optimum 擴展庫對其仍缺乏支持。本文提供了一種使用 OpenVINO opset 重構該模型架構的便捷方法。該方案包含專為 ChatGLM 定制的優化節點,且這些節點都利用英特爾 高級矩陣擴展(Intel Advanced Matrix Extensions,英特爾 AMX)內聯和 MHA(Multi-Head Attention,多頭注意力)融合實現了高度優化。

*請注意,本文僅介紹了通過為 ChatGLM 創建 OpenVINO stateful 模型實現優化的解決方案。本方案受平臺限制,必須使用內置了英特爾 AMX 的第四代英特爾 至強 可擴展處理器1(代號 Sapphire Rapids)。筆者不承諾對該解決方案進行任何維護。

ChatGLM 模型簡介

筆者在查看 ChatGLM 原始模型的源碼時,發現 ChatGLM 與 Optimum ModelForCasualML 并不兼容,而是定義了新的類 ChatGLMForConditionalGeneration。該模型的流水線回路包含 3 個主要模塊(Embedding、GLMBlock 層和 lm_logits),結構如下:

e384e8ca-3e3d-11ee-ac96-dac502259ad0.png

圖 1. ChatGLM 的模型結構

如上圖所示,整個流水線實際要求模型有兩個不同的執行圖,使用輸入提示符進行首次推理時不需要 KV 緩存作為 GLMBlock 層的輸入。從第二次迭代開始,QKV 注意力機制的上一次結果將成為當前一輪模型推理的輸入。隨著生成符的長度不斷增加,在流水線推理過程中,模型輸入和輸出之間將存留大量的大型內存副本。以ChatGLM6b 默認模型配置2為示例,輸入和輸出陣列之間的內存副本類似于以下偽代碼,其內存拷貝的開銷由模型的參數 hidden_size 以及迭代的次數決定:

e3a966f0-3e3d-11ee-ac96-dac502259ad0.png

因此,本文要解決的兩大關鍵問題是:

  • 如何優化模型推理流水線來消除模型輸入和輸出之間的內存副本

  • 如何通過重新設計執行圖來優化 GLMBlock 模塊

構建 OpenVINO stateful 模型
實現顯著優化

首先,需要分析 GLMBlock 層的結構,嘗試封裝一個類并按以下工作流來調用 OpenVINO opset。接著,將圖形數據序列化為 IR 模型 (.xml, .bin)。

e3e5ba4c-3e3d-11ee-ac96-dac502259ad0.png

圖 2. 為 ChatGLM 構建 OpenVINO stateful 模型

關于如何構建 OpenVINO stateful模型,可參閱以下文檔:

https://docs.openvino.ai/2022.3/openvino_docs_OV_UG_network_state_intro.html

OpenVINO 還提供了模型創建樣本,以展示如何通過 opset 構建模型。

https://github.com/openvinotoolkit/openvino/blob/master/samples/cpp/model_creation_sample/main.cpp

ChatGLM 的自定義注意力機制是本文所關注和優化的部分。主要思路是:構建全局上下文結構體,用于在模型內部追加并保存每一輪迭代后的 pastKV 的結果,這樣減少了 pastKV 作為模型輸入輸出的拷貝開銷,同時使用內聯優化以實現 Rotary Embedding 和多頭注意力機制 (Multi-Head Attentions)。 英特爾 AMX 是內置在第四代英特爾至強 可擴展處理器中的矩陣乘法加速器,能夠更快速地處理 bf16 或 int8 數據類型的矩陣乘加運算,通過加速張量處理,顯著提高推理和訓練性能。借助英特爾 AMX 內聯指令(用于加速計算的單指令多操作),實現了對 ChatGLM 模型中 Attention,Rotary Embedding 等算子的高度優化,并且使用 bf16 指令進行乘加操作,在保證浮點指數位精度的同時提高運算效率。 與此同時,本方案還使用 int8 精度來壓縮全連接層的權重,在實時計算中將使用bf16進行計算。因此,無需通過訓練后量化 (PTQ) 或量化感知訓練 (QAT) 對模型進行低精度處理。模型壓縮方法可以降低模型存儲空間,減少內存帶寬的負載,因為計算仍然使用浮點,不會造成溢出,不會對模型精度造成損失。

為 ChatGLM 創建
OpenVINO stateful 模型

請依照下方示例配置軟硬件環境,并按照以下步驟優化 ChatGLM:

硬件要求

第四代英特爾 至強 可擴展處理器(代號 Sapphire Rapids)及后代產品

軟件驗證環境

Ubuntu 22.04.1 LTS 面向 OpenVINO Runtime Python API 的 Python 3.10.11 用于構建 OpenVINO Runtime 的 GCC 11.3.0 cmake 3.26.4

構建 OpenVINO 源碼

  • 安裝系統依賴并設置環境

  • 創建并啟用 Python 虛擬環境

e470899c-3e3d-11ee-ac96-dac502259ad0.png
  • 安裝 Python 依賴

e4832f20-3e3d-11ee-ac96-dac502259ad0.png

  • 使用 GCC 11.3.0 編譯 OpenVINO

  • 克隆 OpenVINO 并升級子模塊

e4918f48-3e3d-11ee-ac96-dac502259ad0.png

  • 安裝 Python 環境依賴,以構建 Python Wheel

e4a4d328-3e3d-11ee-ac96-dac502259ad0.png

  • 創建編譯目錄

e4bfed52-3e3d-11ee-ac96-dac502259ad0.png

  • 使用 CMake 編譯 OpenVINO

e4d4f1b6-3e3d-11ee-ac96-dac502259ad0.png

  • 安裝針對 OpenVINO Runtime 和 openvino-dev 工具構建好的 Python Wheel

e4ee7000-3e3d-11ee-ac96-dac502259ad0.png

  • 檢查系統 GCC 版本和 Conda Runtime GCC 版本。如下所示,如果系統 GCC 版本高于 Conda GCC 版本,請升級 Conda GCC 至相同版本,以滿足 OpenVINO Runtime 的需求。(可選)

e4fbbce2-3e3d-11ee-ac96-dac502259ad0.png

e5131b6c-3e3d-11ee-ac96-dac502259ad0.png

e5284ab4-3e3d-11ee-ac96-dac502259ad0.png

  • 將 PyTorch 模型轉為 OpenVINO IR

e54a0df2-3e3d-11ee-ac96-dac502259ad0.png

使用 OpenVINO Runtime API
為 ChatGLM 構建推理流水線

本文提供了使用 Transformer 和 OpenVINO Runtime API 構建推理流水線的樣本。首先,在test_chatglm.py中,創建一個由transformers.PreTrainedModel衍生的新類。然后,通過使用 OpenVINO Runtime Python API 構建模型推理流水線來更新轉發函數。其他成員函數則遷移自modeling_chatglm.py的 ChatGLMForConditionalGeneration。如此一來,即可確保輸入準備工作、set_random_seed、分詞器/連接器 (tokenizer/detokenizer) 以及余下的流水線操作能夠與原始模型的源碼保持一致。 如需啟用 int8 權重壓縮,只需設置簡單的環境變量 USE_INT8_WEIGHT=1。這是因為在模型生成階段,已使用 int8 對全連接層的權重進行了壓縮,因此模型可在之后的運行過程中直接使用 int8 權重進行推理,從而免除了通過框架或量化工具壓縮模型的步驟。 請按照以下步驟使用 OpenVINO Runtime 流水線測試 ChatGLM:

  • 運行 bf16 模型

e57506d8-3e3d-11ee-ac96-dac502259ad0.png

  • 運行 int8 模型

e5872b92-3e3d-11ee-ac96-dac502259ad0.png

權重壓縮:降低內存帶寬使用率
提升推理速度

本文采用了 Vtune 對模型權重數值精度分別為 bf16 和 int8 的內存帶寬使用率(圖 3 和圖 4)以及 CPI 率進行了性能對比分析(表 1)。結果發現:當模型權重數值精度壓縮至 int8 時,可同時降低內存帶寬使用率和 CPI 率。 e5b9a284-3e3d-11ee-ac96-dac502259ad0.png

圖 3. 模型權重數值精度為 bf16 時的內存帶寬使用率

e5e1afd6-3e3d-11ee-ac96-dac502259ad0.png

圖 4. 模型權重數值精度為 int8 時的內存帶寬使用率

模型權重數值精度

bf16

int8

CPI 率

10.766

1.175

表 1. 采用不同模型權重數值精度時的 CPI 率

每條指令消耗的時鐘周期 (Clockticks per Instruction Retired, CPI) 事件率,也稱為“平均指令周期數 (Cycles per Instruction)”,是基于硬件事件抽樣收集的基礎性能指標之一,在抽樣模式下也稱為“性能監控計數器 (PMC) 分析”。該比率計算方式為:用處于非停機狀態的處理器時鐘周期數 (Clockticks) 除以已消耗指令數。每個處理器用于計算時鐘周期數和已消耗指令數的確切事件可能并不相同,但 VTune Profiler 可辨別和使用正確的數量。 CPI < 1 時,通常為采用指令密集型代碼的應用,而 CPI > 1 則可能是停滯時鐘周期密集型應用,也可能是內存密集型應用。由此,我們可以得出結論,類似 chatGLM 等語言模型對內存帶寬的要求非常高,性能往往受到內存操作或帶寬的限制。很多場景下,消除內存操作的負載,性能會因此獲得大幅收益。在優化此類模型時,如何在不影響精度的同時對模型進行壓縮或輕量化處理是一項不可或缺的技巧。除此之外,在異構平臺和框架上進行部署,還涉及到減少內存/設備存儲之間的數據搬運等優化思路。因此,在壓縮模型的同時,還需要考慮對原始 pytorch 模型推理 forward/generates 等函數流水線的優化,而 OpenVINO 在優化模型自身的同時,還將流水線的優化思路體現在修改模型結構中(將 KV cache保存在模型內部),通過優化 Optimum-intel 等框架的流水線,減少內存拷貝和數據搬運。

結 論

筆者根據上述方法重新設計執行圖并優化了 GLMBlock,消除了 ChatGLM 模型輸入和輸出之間的內存副本,且模型運行高效。隨著 OpenVINO 的不斷升級,本方案的優化工作也將得到推廣并集成至正式發布的版本中。這將有助于擴展更多的大語言模型用例。敬請參考 OpenVINO 官方版本3 和 Optimum-intel OpenVINO 后端4,獲取有關大語言模型的官方高效支持。

作者簡介:

英特爾OpenVINO 開發工具客戶支持工程師趙楨和鄒文藝,英特 OpenVINO 開發工具 AI 框架工程師羅成和李亭騫,都在從事 AI 軟件工具開發與優化工作。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 英特爾
    +關注

    關注

    60

    文章

    9900

    瀏覽量

    171550
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10829

    瀏覽量

    211194

原文標題:一個簡單模型就讓ChatGLM性能大幅提升 | 最“in”大模型

文章出處:【微信號:英特爾中國,微信公眾號:英特爾中國】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用vLLM+OpenVINO加速大語言模型推理

    隨著大語言模型的廣泛應用,模型的計算需求大幅提升,帶來推理時延高、資源消耗大等挑戰。
    的頭像 發表于 11-15 14:20 ?257次閱讀
    使用vLLM+OpenVINO加速大語言<b class='flag-5'>模型</b>推理

    為THS3001構建簡單的SPICE模型

    電子發燒友網站提供《為THS3001構建簡單的SPICE模型.pdf》資料免費下載
    發表于 10-29 10:11 ?0次下載
    為THS3001構建<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>簡單</b>的SPICE<b class='flag-5'>模型</b>

    AI大模型性能優化方法

    AI大模型性能優化是復雜而關鍵的任務,涉及多個方面和策略。以下是些主要的性能優化方法:
    的頭像 發表于 10-23 15:01 ?498次閱讀

    chatglm2-6b在P40上做LORA微調

    2-6B chatglm2-6b相比于chatglm有幾方面的提升: 1. 性能提升: 相比初代模型
    的頭像 發表于 08-13 17:12 ?441次閱讀
    <b class='flag-5'>chatglm</b>2-6b在P40上做LORA微調

    在PyTorch中搭建簡單模型

    在PyTorch中搭建簡單模型通常涉及幾個關鍵步驟:定義模型結構、加載數據、設置損失函數和優化器,以及進行
    的頭像 發表于 07-16 18:09 ?1794次閱讀

    【大語言模型:原理與工程實踐】大語言模型的應用

    ,它通過抽象思考和邏輯推理,協助我們應對復雜的決策。 相應地,我們設計了兩類任務來檢驗大語言模型的能力。類是感性的、無需理性能力的任務,類似于人類的系統1,如情感分析和抽取式問答等。大語言
    發表于 05-07 17:21

    【大語言模型:原理與工程實踐】大語言模型的評測

    安全性的評測則關注模型在強化學習階段的表現。行業模型的評測則針對特定行業的能力,如金融和法律等領域。整體能力的評測從宏觀角度評估模型作為
    發表于 05-07 17:12

    【大語言模型:原理與工程實踐】大語言模型的預訓練

    進行損失計算,得到下一個目標的預測。也會設計些其他輔助訓練任務,與主任務共同訓練。選擇合適的預訓練數據是確保模型性能和泛化能力的關鍵,通過對預訓練數據進行混合配比,以確保能夠獲得全面
    發表于 05-07 17:10

    【大語言模型:原理與工程實踐】大語言模型的基礎技術

    特定任務對模型進行微調。這種方法的成功不僅是自然語言處理發展的轉折點,還為許多現實世界的應用場帶來了前所未有的性能提升。從廣為人知的GP
    發表于 05-05 12:17

    【大語言模型:原理與工程實踐】揭開大語言模型的面紗

    了隨著模型規模擴大,其性能和能力提升速度的變化規律。這定律在深度學習中表現為模型規模與性能改進
    發表于 05-04 23:55

    智譜AI推出新代基座大模型GLM-4

    智譜AI近日宣布推出新代基座大模型GLM-4。這模型在整體性能上相較上代實現了
    的頭像 發表于 01-17 15:29 ?998次閱讀

    三步完成在英特爾獨立顯卡上量化和部署ChatGLM3-6B模型

    ChatGLM3 是智譜 AI 和清華大學 KEG 實驗室聯合發布的新代對話預訓練模型ChatGLM3-6B 是 ChatGLM3 系列
    的頭像 發表于 01-11 18:04 ?1561次閱讀
    三步完成在英特爾獨立顯卡上量化和部署<b class='flag-5'>ChatGLM</b>3-6B<b class='flag-5'>模型</b>

    ChatGLM3-6B在CPU上的INT4量化和部署

    ChatGLM3 是智譜 AI 和清華大學 KEG 實驗室聯合發布的新代對話預訓練模型ChatGLM3-6B 是 ChatGLM3 系列
    的頭像 發表于 01-05 09:36 ?877次閱讀
    <b class='flag-5'>ChatGLM</b>3-6B在CPU上的INT4量化和部署

    “行空板+大模型”——基于ChatGLM的多角色交互式聊天機器人

    模型,結合了深度學習技術和大量中文語料的訓練成果。它在自然語言理解和生成方面展現了出色性能,為國內的自然語言處理研究與應用提供了有力支持。 通過使用行空板和UGB喇叭,你可以制作
    的頭像 發表于 12-08 14:11 ?592次閱讀

    如何從簡單的數學表達式創建Saber模型

    如何從簡單的數學表達式創建Saber模型,將你的輸出描述為輸入的函數?例如 out=a*
    的頭像 發表于 12-05 13:42 ?689次閱讀
    如何從<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>簡單</b>的數學表達式創建<b class='flag-5'>一</b><b class='flag-5'>個</b>Saber<b class='flag-5'>模型</b>?