從零構建屬于自己的GPT系列5:模型部署1(文本生成函數解讀、模型本地化部署、文本生成文本網頁展示、代碼逐行解讀)

🚩🚩🚩Hugging Face 實戰系列 總目錄

有任何問題歡迎在下面留言
本篇文章的代碼運行界面均在PyCharm中進行
本篇文章配套的代碼資源已經上傳

從零構建屬于自己的GPT系列1:數據預處理
從零構建屬于自己的GPT系列2:模型訓練1
從零構建屬于自己的GPT系列3:模型訓練2
從零構建屬于自己的GPT系列4:模型訓練3
從零構建屬于自己的GPT系列5:模型部署1
從零構建屬于自己的GPT系列6:模型部署2

1 前端環境安裝

安裝:

pip install streamlit

測試:

streamlit hello

安裝完成后,測試后打印的信息
在這里插入圖片描述

(Pytorch) C:\Users\admin>streamlit hello
Welcome to Streamlit. Check out our demo in your browser.
Local URL: http://localhost:8501 Network URL:
http://192.168.1.187:8501
Ready to create your own Python apps super quickly? Head over to
https://docs.streamlit.io
May you create awesome apps!

接著會自動的彈出一個頁面
在這里插入圖片描述

2 模型加載函數

這個函數把模型加載進來,并且設置成推理模式

def get_model(device, model_path):tokenizer = CpmTokenizer(vocab_file="vocab/chinese_vocab.model")eod_id = tokenizer.convert_tokens_to_ids("<eod>")  # 文檔結束符sep_id = tokenizer.sep_token_idunk_id = tokenizer.unk_token_idmodel = GPT2LMHeadModel.from_pretrained(model_path)model.to(device)model.eval()return tokenizer, model, eod_id, sep_id, unk_id
  1. 模型加載函數,加載設備cuda,已經訓練好的模型的路徑
  2. 加載tokenizer 文件
  3. 結束特殊字符
  4. 分隔特殊字符
  5. 未知詞特殊字符
  6. 加載模型
  7. 模型進入GPU
  8. 開啟推理模式
  9. 返回參數
device_ids = 0
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICE"] = str(device_ids)
device = torch.device("cuda" if torch.cuda.is_available() and int(device_ids) >= 0 else "cpu")
tokenizer, model, eod_id, sep_id, unk_id = get_model(device, "model/zuowen_epoch40")
  1. 指定第一個顯卡
  2. 設置確保 CUDA 設備的編號與 PCI 位置相匹配,使得 CUDA 設備的編號更加一致且可預測
  3. 通過設置為 str(device_ids)(在這個案例中為 ‘0’),指定了進程只能看到并使用編號為 0 的 GPU
  4. 有GPU用GPU作為加載設備,否則用CPU
  5. 調用get_model函數,加載模型

3 文本生成函數

對于給定的上文,生成下一個單詞

def generate_next_token(input_ids,args):input_ids = input_ids[:, -200:]outputs = model(input_ids=input_ids)logits = outputs.logitsnext_token_logits = logits[0, -1, :]next_token_logits = next_token_logits / args.temperaturenext_token_logits[unk_id] = -float('Inf')filtered_logits = top_k_top_p_filtering(next_token_logits, top_k=args.top_k, top_p=args.top_p)next_token_id = torch.multinomial(F.softmax(filtered_logits, dim=-1), num_samples=1)return next_token_id
  1. 對輸入進行一個截斷操作,相當于對輸入長度進行了限制
  2. 通過模型得到預測,得到輸出,預測的一個詞一個詞進行預測的
  3. 得到預測的結果值
  4. next_token_logits表示最后一個token的hidden_state對應的prediction_scores,也就是模型要預測的下一個token的概率
  5. 溫度表示讓結果生成具有多樣性
  6. 設置預測的結果不可以未知字(詞)的Token,防止出現異常的東西
  7. 通過top_k_top_p_filtering()函數對預測結果進行篩選
  8. 通過預測值轉換為概率,得到實際的Token ID
  9. 返回結果

每次都是通過這種方式預測出下一個詞是什么

4 多文本生成函數

到這里就不止是預測下一個詞了,要不斷的預測

def predict_one_sample(model, tokenizer, device, args, title, context):title_ids = tokenizer.encode(title, add_special_tokens=False)context_ids = tokenizer.encode(context, add_special_tokens=False)input_ids = title_ids + [sep_id] + context_idscur_len = len(input_ids)last_token_id = input_ids[-1]  input_ids = torch.tensor([input_ids], dtype=torch.long, device=device)while True:next_token_id = generate_next_token(input_ids,args)input_ids = torch.cat((input_ids, next_token_id.unsqueeze(0)), dim=1)cur_len += 1word = tokenizer.convert_ids_to_tokens(next_token_id.item())if cur_len >= args.generate_max_len and last_token_id == 8 and next_token_id == 3:breakif cur_len >= args.generate_max_len and word in [".", "。", "!", "!", "?", "?", ",", ","]:breakif next_token_id == eod_id:breakresult = tokenizer.decode(input_ids.squeeze(0))content = result.split("<sep>")[1]  # 生成的最終內容return content
  1. 預測一個樣本的函數
  2. 從用戶獲得輸入標題轉化為Token ID
  3. 從用戶獲得輸入正文轉化為Token ID
  4. 標題和正文連接到一起
  5. 獲取輸入長度
  6. 獲取已經生成的內容的最后一個元素
  7. 把輸入數據轉化為Tensor
  8. while循環
  9. 通過生成函數生成下一個詞的token id
  10. 把新生成的token id加到原本的數據中(原本有5個詞,預測出第6個詞,將第6個詞和原來的5個詞進行拼接)
  11. 輸入長度增加1
  12. 將一個 token ID 轉換回其對應的文本 token
  13. 如果超過最大長度并且生成換行符
  14. 停止生成
  15. 如果超過最大長度并且生成標點符號
  16. 停止生成
  17. 如果生成了結束符
  18. 停止生成
  19. 將Token ID轉化為文本
  20. 將生成的文本按照分隔符進行分割
  21. 返回生成的內容

從零構建屬于自己的GPT系列1:數據預處理
從零構建屬于自己的GPT系列2:模型訓練1
從零構建屬于自己的GPT系列3:模型訓練2
從零構建屬于自己的GPT系列4:模型訓練3
從零構建屬于自己的GPT系列5:模型部署1
從零構建屬于自己的GPT系列6:模型部署2

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

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

相關文章

2023年國賽高教杯數學建模A題定日鏡場的優化設計解題全過程文檔及程序

2023年國賽高教杯數學建模 A題 定日鏡場的優化設計 原題再現 構建以新能源為主體的新型電力系統&#xff0c;是我國實現“碳達峰”“碳中和”目標的一項重要措施。塔式太陽能光熱發電是一種低碳環保的新型清潔能源技術[1]。 ??定日鏡是塔式太陽能光熱發電站&#xff08;以下…

ES6-import后是否有{}的區別

在ES6中&#xff0c;import語句用于導入其他模塊中的變量、函數、類等。在使用import語句時&#xff0c;可以選擇是否使用花括號{}來包裹導入的內容&#xff0c;這會影響導入的內容的使用方式。 1.使用花括號{}&#xff1a; 當使用花括號{}時&#xff0c;表示只導入指定的變量…

【Fastadmin】根據Fieldlist鍵值組件做一個等級配置的完整示例

目錄 1.效果展示&#xff1a; ?編輯 2.建表&#xff1a; 3.html頁面 4.controller控制器 5.js 6.model 1.效果展示&#xff1a; 2.建表&#xff1a; 表名&#xff1a;fa_xxfb_config /*Navicat Premium Data TransferSource Server : rootSource Server Type …

深入Docker命令行:探索常用命令和實用技巧

Docker命令行界面是每個容器開發者的得力工具。在這篇文章中&#xff0c;將深入探討一系列常用的Docker命令&#xff0c;以及一些實用技巧&#xff0c;通過更豐富的示例代碼&#xff0c;幫助大家更全面地理解和運用Docker命令行工具。 1. Docker基本命令 1.1 鏡像操作 深入了…

用 CSS 寫一個漸變色邊框的輸入框

Using_CSS_gradients MDN 多漸變色輸入框&#xff0c;群友問了下&#xff0c;就試著寫了下&#xff0c;看了看 css 漸變色 MDN 文檔&#xff0c;其實很簡單&#xff0c;代碼記錄下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

使用FFMPEG轉碼,轉單聲道,轉標準WAV,轉PCM

本文為使用FFMPEG命令行的方式處理音頻&#xff0c;來獲取想要得到的音頻文件。 零、使用命令行查看編碼封裝信息 格式&#xff1a;ffprobe.exe -show_format inputfile 例子&#xff1a;ffprobe.exe -show_format .\stereo_44_16bit.wav 運行結果為下圖&#xff1a; 如圖可…

C# Channel實現線程間通信

C# Channel實現線程間通信 同步方式實現&#xff1a; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Channels; using System.Threading.T…

【JavaFX】實現計算器小程序

下面是一個簡單的JavaFX計算器示例: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.…

西南科技大學數字電子技術實驗四(基本觸發器邏輯功能測試及FPGA的實現)預習報告

一、計算/設計過程 說明:本實驗是驗證性實驗,計算預測驗證結果。是設計性實驗一定要從系統指標計算出元件參數過程,越詳細越好。用公式輸入法完成相關公式內容,不得貼手寫圖片。(注意:從抽象公式直接得出結果,不得分,頁數可根據內容調整) (1)D觸發器 特征方程: Q…

往adobe illustrator中添加latex字體

找到如下字體所在路徑 /path/to/miktex/type1\public\amsfonts\cm然后copy相應的字體文件 cmmi10.pfb將相應的pfb文件復制到Adobe illustrator字體文件夾: /path/to/illustrator/Support Files/Required/Fonts然后重啟即可。

ChatGPT/GPT4應用:文本、論文、編程、繪圖等,提高工作效率及科研項目開發能力

2023年隨著OpenAI開發者大會的召開&#xff0c;最重磅更新當屬GPTs&#xff0c;多模態API&#xff0c;未來自定義專屬的GPT。微軟創始人比爾蓋茨稱ChatGPT的出現有著重大歷史意義&#xff0c;不亞于互聯網和個人電腦的問世。360創始人周鴻祎認為未來各行各業如果不能搭上這班車…

排序-選擇排序與堆排序

文章目錄 一、選擇排序二、堆排序三、時間復雜度四、穩定性 一、選擇排序 思想&#xff1a; 將數組第一個元素作為min&#xff0c;然后進行遍歷與其他元素對比&#xff0c;找到比min小的數就進行交換&#xff0c;直到最后一個元素就停止&#xff0c;然后再將第二個元素min&…

【單調棧】【二分查找】LeetCode: 2454.下一個更大元素 IV

作者推薦 【動態規劃】【廣度優先】LeetCode2258:逃離火災 本文涉及的基礎知識點 二分查找算法合集 單調棧 題目 給你一個下標從 0 開始的非負整數數組 nums 。對于 nums 中每一個整數&#xff0c;你必須找到對應元素的 第二大 整數。 如果 nums[j] 滿足以下條件&#xff…

音視頻技術開發周刊 | 323

每周一期&#xff0c;縱覽音視頻技術領域的干貨。 新聞投稿&#xff1a;contributelivevideostack.com。 Meta牽頭組建開源「AI復仇者聯盟」&#xff0c;AMD等盟友800億美元力戰OpenAI英偉達 超過50家科技大廠名校和機構&#xff0c;共同成立了全新的人工智能聯盟。以開源為旗號…

RocketMQ的架構是什么樣的?

RocketMQ&#xff0c;作為一款強大的分布式消息中間件&#xff0c;廣泛應用于各種大規模分布式系統中&#xff0c;為異步消息通信提供了可靠的解決方案。本文將深入探討RocketMQ的核心組件&#xff0c;包括Producer、Broker、Consumer和NameServer&#xff0c;以及它們在整個架…

高中物理電學總結之穩恒電流篇

高中物理電學總結之穩恒電流篇 電流電流的定義對電流的微觀分析 電阻歐姆定律電阻的串并聯電阻定律 電源的電動勢電源電動勢 閉合電路歐姆定律閉合電路閉合電路歐姆定律 電流做功與焦耳定律電流做功電功率焦耳定律電源效率 電表改裝 電流 電流的定義 電解質溶液中的自由電荷是…

ACwing算法備戰藍橋杯——Day30——樹狀數組

定義&#xff1a; 樹狀數組是一種數據結構&#xff0c;能將對一個區間內數據進行修改和求前綴和的這兩種操作的最壞時間復雜度降低到O(logn); 實現所需變量 變量名變量數據類型作用數組a[]int存儲一段區間數組tr[]int表示樹狀數組 主要操作 函數名函數參數組要作用lowbit()int…

Linux-RedHat系統-安裝 中間件 Tuxedo

安裝步聚 一、中間件安裝包&#xff1a; tuxedo121300_64_Linux_01_x86 Tuxedo下載地址&#xff1a; Oracle Tuxedo Downloads 二、新建用戶&#xff1a; &#xff08;創建Oracle用戶時&#xff0c;需要root權限操作&#xff09; 創建用戶&#xff1a; # useradd oracle …

es6從url中獲取想要的參數

第一種方法 很古老&#xff0c;通過 split 方法慢慢截取&#xff0c;可行是可行但是這個方法有一個弊端&#xff0c;因為 split 是分割成數組了&#xff0c;只能按照下標的位置獲取值&#xff0c;所以就是參數位置一旦發生變化&#xff0c;那么獲取到的值也就錯位了 let user…

利用python將data:image/jpg; base64,格式數據轉化下載為圖片

在做爬蟲爬取圖片時&#xff0c;發現有的圖片url是用“data:image/jpg;base64” 開頭的&#xff0c;例如下圖 部分開頭樣式如下&#xff1a; 1、data:image/jpg; base64, 2、data:image/png; base64, 3、data:image/webp;base64, 利用python進行代碼進行圖片下載&#xff0c;…