使用GPTQ量化Llama-3-8B大模型

使用GPTQ量化8B生成式語言模型

服務器配置:4*3090
在這里插入圖片描述
描述:使用四張3090,分別進行單卡量化,多卡量化。并使用SGLang部署量化后的模型,使用GPTQ量化
原來的模型精度為FP16,量化為4bit

首先下載gptqmodel量化工具

因為要離線量化,所以需要提前下載好模型權重文件,校準數據集使用allenai/c4,需要使用HF的鏡像來下載:參考我的這篇文章

huggingface-cli download --repo-type dataset --resume-download allenai/c4 --local-dir ./calibration

單卡量化

初始量化代碼:

from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfigmodel_id = "/home/zgq/Meta-Llama-3-8B-Instruct"
quant_path = "/home/zgq/sglang/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 直接加載本地數據集,不再從 Hugging Face 下載
calibration_dataset = load_dataset("json",  # 指定數據格式data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",  # 指定本地路徑split="train"
).select(range(1024))["text"]  # 選擇前 1024 條數據quant_config = QuantizeConfig(bits=4,# 量化為 4 位group_size=128  # 分組大小為 128) # quantization config
model = GPTQModel.load(model_id, quant_config) # load modelmodel.quantize(calibration_dataset, batch_size=2) # quantize
model.save(quant_path) # save model

在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
量化過程出現了OOM
解決方案:
首先嘗試將batch_size降為1
優化顯存管理:export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
插入梯度檢查點:model.gradient_checkpointing_enable()

調整參數后第二次嘗試量化:

from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig
import torch# torch.cuda.empty_cache()
# torch.cuda.set_per_process_memory_fraction(0.9)  # 保留 80% 顯存model_id = "/home/zgq/Meta-Llama-3-8B-Instruct"
quant_path = "/home/zgq/sglang/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 直接加載本地數據集,不再從 Hugging Face 下載
calibration_dataset = load_dataset("json",  # 指定數據格式data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",  # 指定本地路徑split="train"
).select(range(1024))["text"]  # 選擇前 1024 條數據quant_config = QuantizeConfig(bits=4,# 量化為 4 位group_size=128  # 分組大小為 128) # quantization config
model = GPTQModel.load(model_id, quant_config) # load modelmodel.gradient_checkpointing_enable()
model.quantize(calibration_dataset, batch_size=1) # quantize
model.save(quant_path) # save model

在這里插入圖片描述
在這里插入圖片描述
使用SGLang部署后發現:
在這里插入圖片描述
這里KV 緩存的大小明顯增大了數倍,這能極大的提高并發數量
調整之后量化成功(可見降低了64.30%的顯存空間),但是總共耗時了將近一小時的時間,因此我想使用四卡并行量化

四卡量化

在這里插入圖片描述
可以看到內存在急速分配,說明模型權重需要先搬運到內存,再傳遞到顯存中。
然后報了OOM的錯誤!于是更改了代碼:

import os
import torch
import torch.distributed as dist
from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig# 初始化分布式環境
def init_distributed():dist.init_process_group(backend="nccl")print(f"Rank {dist.get_rank()}: Distributed environment initialized.")local_rank = int(os.environ["LOCAL_RANK"])torch.cuda.set_device(local_rank)return local_rankdef main():local_rank = init_distributed()# 模型路徑和量化保存路徑model_id = "/home/zgq/Meta-Llama-3-8B-Instruct"quant_path = "/home/zgq/Meta-Llama-3-8B-Instruct-gptqmodel-4bit"# 加載本地校準數據集(每個進程加載自己的分片)calibration_dataset = load_dataset("json",data_files="calibration_data/en.noblocklist/c4-train.00001-of-01024.json.gz",split=f"train[{local_rank * 256}:{(local_rank + 1) * 256}]")["text"]print(f"Rank {dist.get_rank()}: Loaded {len(calibration_dataset)} samples.")# 量化配置quant_config = QuantizeConfig(bits=4,group_size=128)# 分布式加載模型model = GPTQModel.load(model_id,quant_config,device_map={"": local_rank},torch_dtype=torch.float16,low_cpu_mem_usage=True)print(f"Rank {dist.get_rank()}: Model loaded on GPU {local_rank}.")# 啟用梯度檢查點model.gradient_checkpointing_enable()# 分布式量化(每個進程處理自己的數據分片)model.quantize(calibration_dataset, batch_size=1)print(f"Rank {dist.get_rank()}: Quantization completed.")# 主進程保存量化模型if local_rank == 0:model.save(quant_path)print(f"Rank {dist.get_rank()}: Model saved to {quant_path}.")dist.barrier()  # 等待所有進程完成if __name__ == "__main__":main()

程序啟動命令為:torchrun --nproc_per_node=4 torch-dist-gptq.py (指定每個節點使用 4 個 GPU,根據你的環境來修改)

在這里插入圖片描述
可見四卡并行的方式要快很多!
在這里插入圖片描述
以上圖片是運行時硬件狀態。
在這里插入圖片描述
量化完成,和單卡量化效果一致,但是縮短了量化時間,效率約提升了4.5倍!

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

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

相關文章

防汛應急包,快速響應,守護安全

根據中國水利部統計,自1949年以來,我國幾乎每年都面臨洪水威脅,其中20世紀90年代后洪澇災害頻率顯著增加,僅1990-2009年間就發生超4000起較大災害,直接經濟損失近3萬億元,受災人口達20億人次。在2020年長江…

從 Vue 到 React:理解作用與副作用

作用 VS 副作用 響應式作用: 響應式作用是 Vue 響應式系統的一部分,它指的是跟蹤函數的依賴關系,并在它們的值發生變化時重新運行該函數的過程。watchEffect 是最直接的創建作用的方式(如 watch 和 computed)。 副作…

a = b c 的含義

簡單一句話: result condition && value; condition 為真取 value的值,condition為假就取condition的值,真取后假取前 // 示例 1: b 為真值 let b 1; let c 2; let a b && c; console.log(a); // 輸出: 2// 示例 2: b 為…

【大模型系列】llama.cpp本地運行大模型

上一篇鏈接: 【大模型系列】使用ollama本地運行千問2.5模型 我們講了ollama本地運行大模型,這里我們介紹另一種本地運行大模型的方法:llamacpp 軟件下載 下載地址:https://github.com/ggml-org/llama.cpp/releases 下載cpu版本的llamacpp&a…

PyQt基礎——簡單的圖形化界面(窗口)

一、代碼展示 import sysfrom PyQt6.QtGui import QPixmap from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QLineEdit, QPushButton from PyQt6 import uic from PyQt6.QtCore import Qt# 封裝一個我的窗口類 class MyWidget(QWidget):def __init__(self):supe…

泰山派開發之—Ubuntu24.04下Linux開發環境搭建

簡介 最近翻到了吃灰已久的泰山派,是剛出來的時候用優惠券買的,當時價格挺便宜的,最近給它翻出來了,打算試試做個項目。買的泰山派容量是2G16G,SOC芯片使用的是RK3566,搭載1TOP算力的NPU,并且具…

HTTP 協議中常見的錯誤狀態碼(詳細介紹)

以下是 HTTP 協議中常見的錯誤狀態碼及其原因的總結,按錯誤類型分類整理: 4xx 客戶端錯誤 400 Bad Request 原因:請求格式錯誤,服務器無法解析。常見場景: 請求頭或請求體語法錯誤(如 JSON/XML 格式錯誤…

kkFileView文件預覽組件部署說明

kkFileView組件部署流程指南 在數字化辦公與文件管理場景中,在線文件預覽功能極為關鍵。kkFileView作為一款優秀的開源在線文件預覽組件,支持多種格式文件的預覽,為企業和開發者提供了便捷的解決方案。下面將詳細介紹其部署步驟。 一、前期準…

[React Native]Stack、Tab和Drawer導航器詳解

對于StackNavigator,網頁[1]提到它用于頁面間的層級跳轉,使用棧結構管理頁面。網頁[4]和[8]詳細說明了navigationOptions的配置,比如標題、頭部樣式等。網頁[3]展示了如何在Stack中嵌入Tab導航,這可以作為組合使用的例子。 TabNa…

激光雷達產業觀察--速騰聚創發展脈絡2025.3.14

一.發展歷程 1.1 企業創立 速騰聚創的創立可追溯至2014年8月28日,這家充滿活力的高科技企業誕生于中國深圳。公司創始人邱純鑫是一位富有遠見的企業家,他的創業之路充滿了創新精神和技術洞察力。 邱純鑫的創業靈感源于他在哈爾濱工業大學深圳校區的學…

Kubernetes 網絡方案全解析:Flannel、Calico 與 Cilium 對比與選擇

文章目錄 Kubernetes 網絡方案全解析:Flannel、Calico 與 Cilium 對比與選擇Flannel —— 輕量級基礎網絡簡介核心特性適用場景 Calico —— 高性能與安全兼備的成熟方案簡介核心特性適用場景 Cilium —— 基于 eBPF 的下一代網絡方案簡介核心特性適用場景 深入對比…

OpenCV實現圖像分割與無縫合并

一、圖像分割核心方法 1、閾值分割 #include <opencv2/opencv.hpp> using namespace cv; int main() {Mat img imread("input.jpg", IMREAD_GRAYSCALE);Mat binary;threshold(img, binary, 127, 255, THRESH_BINARY); // 固定閾值分割imwrite("binary.…

計算機視覺算法實戰——駕駛員分心檢測(主頁有源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ? ??? 1. 領域簡介&#xff1a;駕駛員分心檢測的意義與挑戰 駕駛員分心檢測是智能駕駛安全領域的重要研究方向。據統計&#xff0c;全球每…

scoop退回軟件版本的方法

title: scoop退回軟件版本的方法 date: 2025-3-11 23:53:00 tags: 其他 前言 在軟件更新后&#xff0c;如果出現了很影響使用體驗的問題&#xff0c;那么可以把軟件先退回以前的版本進行使用&#xff0c; 但是scoop本身并沒有提供直接讓軟件回退版本的功能&#xff0c;因此…

OpenRewrite配方之import語句的順序——org.openrewrite.java.OrderImports

org.openrewrite.java.OrderImports 是 OpenRewrite 工具庫中的一個重要規則(Recipe),專為 Java 項目設計,用于自動化調整 import 語句的順序,使其符合預定義的代碼規范。從而提高代碼的一致性和可讀性。 核心功能 排序規則: 靜態導入優先:默認將靜態導入(import stati…

搭建活動報名新神器

用戶痛點 以往&#xff0c;依靠傳統的手動報名方式&#xff0c;像 Excel 表格登記或者郵件收集信息&#xff0c;在活動規模較小時或許還能應付。可一旦參與人數增多&#xff0c;問題就接踵而至&#xff1a;信息分散在不同文檔和郵件中&#xff0c;難以集中管理&#xff1b;人工…

MySQL增刪改查操作 -- CRUD

個人主頁&#xff1a;顧漂亮 目錄 1.CRUD簡介 2.Create新增 使用示例&#xff1a; 注意點&#xff1a; 3.Retrieve檢索 使用示例&#xff1a; 注意點&#xff1a; 4.where條件查詢 前置知識&#xff1a;-- 運算符 比較運算符 使用示例&#xff1a; 注意點&#xf…

設計模式C++

針對一些經典的常見的場景, 給定了一些對應的解決方案&#xff0c;這個就叫設計模式。 設計模式的作用&#xff1a;使代碼的可重用性高&#xff0c;可讀性強&#xff0c;靈活性好&#xff0c;可維護性強。 設計原則&#xff1a; 單一職責原則&#xff1a;一個類只做一方面的…

STM32上實現簡化版的AUTOSAR DEM模塊

文章目錄 摘要摘要 在一些可以不使用AUTOSAR的項目中,往往也有故障檢測和DTC存儲的需求,開發一套類似于AUTOSAR DEM模塊的軟件代碼,能夠滿足DTC的檢出和存儲,使用FalshDB代替Nvm模塊,輕松構建持久化存儲,如果你也有這樣的需求,請閱讀本篇,希望能夠幫到你。 /*********…

html css網頁制作成品——糖果屋網頁設計(4頁)附源碼

目錄 一、&#x1f468;?&#x1f393;網站題目 二、??網站描述 三、&#x1f4da;網站介紹 四、&#x1f310;網站效果 五、&#x1fa93; 代碼實現 &#x1f9f1;HTML 六、&#x1f947; 如何讓學習不再盲目 七、&#x1f381;更多干貨 一、&#x1f468;?&#x1f…