LLM 入門與實踐(四) Yi 部署與分析

?本文截取自20萬字的《PyTorch實用教程》(第二版),敬請關注:《Pytorch實用教程》(第二版)無論是零基礎入門,還是CV、NLP、LLM項目應用,或是進階工程化部署落地,在這里都有。相信在本書的幫助下,讀者將能夠輕松掌握 PyTorch 的使用,成為一名優秀的深度學習工程師。《Pytorch實用教程》(第二版)無論是零基礎入門,還是CV、NLP、LLM項目應用,或是進階工程化部署落地,在這里都有。相信在本書的幫助下,讀者將能夠輕松掌握 PyTorch 的使用,成為一名優秀的深度學習工程師。 - TingsongYu/PyTorch-Tutorial-2ndicon-default.png?t=N7T8https://github.com/TingsongYu/PyTorch-Tutorial-2nd

LLM 入門與實踐(一)Qwen部署與分析

LLM 入門與實踐(二)ChatGLM3 部署與分析

LLM 入門與實踐(三)Baichuan2 部署與分析

LLM 入門與實踐(四) Yi 部署與分析

前言

Yi是由零一萬物開源的大語言模型,目前(2024年4月16日)包括6B和34B-chat版本,base版本有6B、9B和34B。

零一萬物是2023年7月,李開復籌組新公司,部注冊于北京,集中在大模型技術、人工智能算法、自然語言處理、系統架構、算力架構、數據安全、產品研發等領域。

更多信息:

  • 公司官網:零一萬物-AI2.0大模型技術和應用的全球公司

  • HF: https://huggingface.co/01-ai

  • github: 01.AI · GitHub

  • LLM-github:GitHub - 01-ai/Yi: A series of large language models trained from scratch by developers @01-ai

  • 技術報告:https://arxiv.org/abs/2403.04652

部署安裝

第一步,代碼下載

git clone https://github.com/01-ai/Yi.git

第二步,權重下載

git clone https://www.modelscope.cn/01ai/Yi-6B-Chat-4bits.git

第三步,量化環境安裝

int4和int8分別需要AWQ和GPTQ環境

pip install autoawq
?
https://github.com/casper-hansen/AutoAWQ?tab=readme-ov-file#install-from-pypi
https://github.com/AutoGPTQ/AutoGPTQ?tab=readme-ov-file#quick-installation

第四步,配置代碼中模型路徑

parser.add_argument("-c","--checkpoint-path",type=str,default=r"G:\04-model-weights\Yi-6B-Chat-4bits",help="Checkpoint name or path, default to %(default)r",
) ? ? ? ?default=r"G:\04-model-weights\Yi-6B-Chat-4bits",
?

第五步,運行代碼

Yi沒有提供命令行的交互demo,提供的事web ui版,運行Yi\demo\web_demo.py 即可跳出基于gradio的交互界面。

修改后的代碼可參考github

模型UML分析

Yi的github倉庫及模型權重倉庫均未找到類似Qwen、ChatGLM、Baichuan那樣的模型文件,因此無法深入探究模型結構。

為了探究Yi模型的推理步驟,debug觀察到以下信息,供流程分析所用。

  1. model = AutoModelForCausalLM.from_pretrained 獲得的模型是LlamaForCausalLM類,其中的核心model是LlamaModel

LlamaForCausalLM((model): LlamaModel((embed_tokens): Embedding(64000, 4096)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaSdpaAttention((q_proj): WQLinear_GEMM(in_features=4096, out_features=4096, bias=False, w_bit=4, group_size=128)(k_proj): WQLinear_GEMM(in_features=4096, out_features=512, bias=False, w_bit=4, group_size=128)(v_proj): WQLinear_GEMM(in_features=4096, out_features=512, bias=False, w_bit=4, group_size=128)(o_proj): WQLinear_GEMM(in_features=4096, out_features=4096, bias=False, w_bit=4, group_size=128)(rotary_emb): LlamaRotaryEmbedding())(mlp): LlamaMLP((gate_proj): WQLinear_GEMM(in_features=4096, out_features=11008, bias=False, w_bit=4, group_size=128)(up_proj): WQLinear_GEMM(in_features=4096, out_features=11008, bias=False, w_bit=4, group_size=128)(down_proj): WQLinear_GEMM(in_features=11008, out_features=4096, bias=False, w_bit=4, group_size=128)(act_fn): SiLU())(input_layernorm): LlamaRMSNorm()(post_attention_layernorm): LlamaRMSNorm()))(norm): LlamaRMSNorm())(lm_head): Linear(in_features=4096, out_features=64000, bias=False)
)
  1. 在模型權重的config.json中,體現模型架構為LlamaForCausalLM

{"architectures": ["LlamaForCausalLM"],"attention_bias": false,"bos_token_id": 1,"eos_token_id": 2,"hidden_act": "silu","hidden_size": 4096,"initializer_range": 0.02,"intermediate_size": 11008,"max_position_embeddings": 4096,"model_type": "llama","num_attention_heads": 32,"num_hidden_layers": 32,"num_key_value_heads": 4,"pretraining_tp": 1,"quantization_config": {"bits": 4,"group_size": 128,"quant_method": "awq","version": "gemm","zero_point": true},"rms_norm_eps": 1e-05,"rope_scaling": null,"rope_theta": 5000000.0,"tie_word_embeddings": false,"torch_dtype": "float16","transformers_version": "4.35.0","use_cache": true,"vocab_size": 64000
}
?

Prompt 結構分析

web_demo.py代碼結構整體基于transformers庫的工具來實現,推理采用流處理,基于transformers的TextIteratorStreamer實現,模型單次推理由TextIteratorStreamer代理,這里不深入。

這里看看Yi源代碼中的predict函數,該函數對歷史對話進行了處理,實現多輪對話的Prompt處理。大體可分為4步:

第一步:將歷史信息轉為模型輸入的tokens_ids, 這一步調用transformers的apply_chat_template接口功能實現;

第二步:創建流處理器TextIteratorStreamer

第三步:組裝本輪對話所需信息,generate_kwargs

第四步:啟動線程執行model.generate, 從流處理器streamer中拿單次推理的結果

由于大部分是transformers庫的代碼,此處就不深入展開了

def predict(history, max_length, top_p, temperature):stop = StopOnTokens()messages = []for idx, (user_msg, model_msg) in enumerate(history):if idx == len(history) - 1 and not model_msg:messages.append({"role": "user", "content": user_msg})breakif user_msg:messages.append({"role": "user", "content": user_msg})if model_msg:messages.append({"role": "assistant", "content": model_msg})
?print("\n\n====conversation====\n", messages)model_inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_tensors="pt").to(next(model.parameters()).device)streamer = TextIteratorStreamer(tokenizer, timeout=60, skip_prompt=True, skip_special_tokens=True)generate_kwargs = {"input_ids": model_inputs,"streamer": streamer,"max_new_tokens": max_length,"do_sample": True,"top_p": top_p,"temperature": temperature,"stopping_criteria": StoppingCriteriaList([stop]),"repetition_penalty": 1.2,}t = Thread(target=model.generate, kwargs=generate_kwargs)t.start()
?for new_token in streamer:if new_token != "":history[-1][1] += new_tokenyield history

小結

通過Yi的代碼,可以了解如何快速基于transformers構建一個LLM推理部署代碼。

并且可以了解GPTQ和AWQ的部署需要單獨安裝對應的python庫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43183.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python對象

類 我們目前所學習的對象都是Python內置的對象但是內置對象并不能滿足所有的需求,所以我們在開發中經常需要自定義一些對象類,簡單理解它就相當于一個圖紙。在程序中我們需要根據類來創建對象類就是對象的圖紙!我們也稱對象是類的實例&#…

JAVA--IO流

一、IO流什么? I/O是Input/output的縮寫,用于處理設備之間的數據傳輸。如讀/寫文件、網絡通訊。 java程序中,對于數據的輸入、輸出是以流(Stream)的方式進行。 Java.io包下提供了各種流類和接口,用以獲取不同種類的數…

web自動化(六)unittest 測試報告跳過用例

三種類型測試報告:unittest.TextTestRunner、BeautifulReport、HTMLTestRunner Python3.0 無法直接安裝 HTMLTestRunner 安裝 XTestRunner pip install XTestRunner安裝 BeautifulReport pip install BeautifulReportimport unittestclass TestSkipCase(unittest…

ELfK logstash filter模塊常用的插件 和ELFK部署

ELK之filter模塊常用插件 logstash filter模塊常用的插件&#xff1a; filter&#xff1a;表示數據處理層&#xff0c;包括對數據進行格式化處理、數據類型轉換、數據過濾等&#xff0c;支持正則表達式 grok 對若干個大文本字段進行再分割成一些小字段 (?<字段名…

【算法篇】KMP算法,一種高效的字符串匹配算法

我們今天了解一個字符串匹配算法-KMP算法&#xff0c;內容難度相對來說較高&#xff0c;建議先收藏再細品&#xff01;&#xff01;&#xff01; KMP算法的基本概念 KMP算法是一種高效的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#…

LLMs之gptpdf:gptpdf的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之gptpdf&#xff1a;gptpdf的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 gptpdf的簡介 1、處理流程 第一步&#xff0c;使用 PyMuPDF 庫&#xff0c;對 PDF 進行解析出所有非文本區域&#xff0c;并做好標記&#xff0c;比如: 第二步&#xff0c;使用視覺大模型&…

離婚后,孩子就讀私立高中的高昂學費誰承擔?

江蘇省南京市六合區人民法院審結一起撫養費糾紛案件&#xff0c;認定夫妻雙方在決定孩子教育事務上均存在責任&#xff0c;為保障臨近高考的未成年子女的切身利益&#xff0c;認定由夫妻雙方按比例承擔教育費。   2015年6月&#xff0c;李某與王某離婚&#xff0c;雙方之子小…

PCL 有序點云的法線估計(使用積分圖進行法線估計)

使用積分圖進行法線估計 一、概述1.1 概念1.2 有序點云與無序點云1.2.1 有序點云1.2.2 無序點云1.3 代碼講解二、代碼實現三、結果示例一、概述 1.1 概念 使用積分圖進行法線估計:計算一個有序點云的法線,注意該方法只適用于有序點云。 1.2 有序點云與無序點云 有序點云與無…

MySQL安裝時initializing database失敗

問題頁面&#xff1a; 解決方法&#xff1a; 1.勾選紅框中的選項&#xff1a; 2.將下圖紅框中全部改為英文&#xff1a; 然后一路next就可以了。

cs231n作業1——KNN

參考文章&#xff1a;assignment1——KNN KNN 測試時分別計算測試樣本和訓練集中的每個樣本的距離&#xff0c;然后選取距離最近的k個樣本的標簽信息來進行分類。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…

vue3使用方式匯總

1、引入iconfont阿里圖庫圖標&#xff1a; 1.1 進入阿里圖標網站&#xff1a; iconfont阿里&#xff1a;https://www.iconfont.cn/ 1.2 添加圖標&#xff1a; 1.3 下載代碼&#xff1a; 1.4 在vue3中配置代碼&#xff1a; 將其代碼復制到src/assets/fonts/目錄下&#xff1…

Mysql之Using index for skip scan

一、Using index for skip scan 在 MySQL 中&#xff0c;EXPLAIN 語句用于顯示查詢執行計劃&#xff0c;幫助我們理解查詢是如何被執行的&#xff0c;以及如何優化查詢。其中&#xff0c;Extra 列提供了關于查詢執行的一些額外信息。當 Extra 列顯示 Using index for skip sca…

CF F. Alex‘s whims

原題鏈接&#xff1a;Problem - 1899F - Codeforces 題目大意&#xff1a;要求構建出一顆樹&#xff0c;多次詢問樹的葉節點之間的距離有沒有達到要求的距離&#xff0c;如果有直接輸出-1 -1 -1&#xff0c;如果沒有可以斷開一條邊和連上一條邊&#xff0c;輸出x y z&#xff…

mp4視頻太大怎么壓縮不影響畫質,mp4文件太大怎么變小且清晰度高

在數字化時代&#xff0c;我們常常面臨視頻文件過大的問題。尤其是mp4格式的視頻&#xff0c;文件大小往往令人望而卻步。那么&#xff0c;如何在不影響畫質的前提下&#xff0c;有效地壓縮mp4視頻呢&#xff1f;本文將為您揭秘幾種簡單實用的壓縮技巧。 在分享和存儲視頻時&am…

Open3D 計算點云的歐式距離

目錄 一、概述 1.1歐式距離定義 1.2作用和用途 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2處理后點云 一、概述 在Open3D中&#xff0c;compute_point_cloud_distance函數用于計算兩個點云之間的距離。具體來說&#xff0c;它計算的是源點云…

【計算機網絡仿真】b站湖科大教書匠思科Packet Tracer——實驗16 路由信息協議RIP

一、實驗目的 1.驗證RIP協議的作用&#xff1b; 二、實驗要求 1.使用Cisco Packet Tracer仿真平臺&#xff1b; 2.觀看B站湖科大教書匠仿真實驗視頻&#xff0c;完成對應實驗。 三、實驗內容 1.構建網絡拓撲&#xff1b; 2.驗證RIP協議。 四、實驗步驟 1.構建網絡拓撲 …

sdbusplus:將文件描述符作為method的返回值

sdbusplus:通過文件描述符作為參數調用method_libsdbusplus-CSDN博客 介紹了使用文件描述符作為參數的方式 文件描述符也可以作為method的返回值,然后用來傳遞數據 服務器端: //s.cpp #include <sdbusplus/asio/connection.hpp> #include <sdbusplus/asio/object…

js list to tree

在JavaScript中&#xff0c;將列表轉換為樹結構是一種常見的操作&#xff0c;尤其是在處理需要層級展示的數據&#xff0c;如菜單、分類等。這通常涉及到遞歸函數和對象的引用。以下是一個簡單的例子&#xff0c;展示了如何將一個扁平化的列表轉換為多層級樹結構。 假設我們有以…

【圖像處理】Krita 一款開源免費專業圖像處理軟件分享

軟件介紹 Krita 是一款專業級的圖像處理軟件&#xff0c;適合數字繪畫和創作。它不僅支持柵格圖像的細致編輯&#xff0c;還提供了強大的矢量圖形工具&#xff0c;使得用戶可以在同一個平臺上完成多種類型的創作工作。同時具備一定的矢量圖形編輯功能。Krita 的首要用途是繪畫…

黑馬點評商戶緩存查詢作業——Redis中查詢商戶類型

記錄下自己在gpt幫助下完成的第一個需求~~~ 1. ShopTypeController 2. IShopTypeService 3. ShopTypeServiceImpl&#xff08;模仿ShopServiceImpl來寫的&#xff09; 一共分為“1.redis中查詢緩存”→“2.判斷緩存是否存在&#xff0c;存在直接返回”→“3.緩存不存在則去查數…