前言
本文在jetson設備上使用llama.cpp完成gpt-oss 20b的部署,包括后端推理和GUI的可視化交互。
使用的設備為orin nx 16g(super),這個顯存大小推理20b的模型完全沒有問題。
使用硬件如下,支持開啟super模式。(https://www.seeedstudio.com/reComputer-Super-J4012-p-6443.html)
- jetpack版本:6.2
- 系統:ubuntu 22.04
- CUDA版本:12.6
安裝llama.cpp
拉取llama.cpp
,maste分支下25年8月份之后支持gpt-oss:
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
進行編譯,編譯時間會比較長:
sudo apt update
sudo apt install -y build-essential cmake git
cmake -B build -DGGML_CUDA=ON
cmake --build build --parallel # 平行編譯
如果出現cuda相關的路徑錯誤,如下:
-- Found CUDAToolkit: /usr/local/cuda/include (found version "12.6.68")
-- CUDA Toolkit found
-- Using CUDA architectures: 50;61;70;75;80
CMake Error at /usr/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake:726 (message):Compiling the CUDA compiler identification source file"CMakeCUDACompilerId.cu" failed.Compiler: CMAKE_CUDA_COMPILER-NOTFOUNDBuild flags:Id flags: -vThe output was:No such file or directoryCall Stack (most recent call first):/usr/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake:6 (CMAKE_DETERMINE_COMPILER_ID_BUILD)/usr/share/cmake-3.22/Modules/CMakeDetermineCompilerId.cmake:48 (__determine_compiler_id_test)/usr/share/cmake-3.22/Modules/CMakeDetermineCUDACompiler.cmake:298 (CMAKE_DETERMINE_COMPILER_ID)ggml/src/ggml-cuda/CMakeLists.txt:25 (enable_language)-- Configuring incomplete, errors occurred!
說明編譯器環境路徑不對,參考下面指令修復,cuda-12.6
換為你使用的cuda版本:
export PATH=/usr/local/cuda-12.6/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
編譯完成后,在llama.cpp
目錄下安裝后續轉換模型需要用的依賴:
pip install -e .
后續調用該目錄下的腳本與執行文件即可。
下載gpt-oss模型
option A : 使用 huggingface-cli 下載
該方法下載模型需要翻墻,如果網絡環境不好請看option B。
安裝HuggingFace-cli,并下載模型:
pip install -U "huggingface_hub[cli]"
huggingface-cli download openai/gpt-oss-20b --local-dir gpt-oss-20b/
option B: 手動下載
國內使用使用huggingface-cli下載模型經常鏈接不上服務器,這種情況可以選擇手動下載。
進入Hugging Face中gpt-oss的主頁,如下:
https://huggingface.co/openai/gpt-oss-20b/tree/main
圖中的幾個就是模型文件以及相關的參數文件,點擊下載后,放到同一個目錄下:
轉換模型與量化
把模型從HuggingFace格式轉為gguf
格式:
python convert_hf_to_gguf.py --outfile /home/seeed/Downloads/gpt-oss /home/seeed/Documents/gpt-oss-gguf/
# python convert_hf_to_gguf.py --outfile <輸入模型的路徑> <輸出模型的路徑>
對模型進行量化:
./build/bin/llama-quantize /home/seeed/Documents/gpt-oss-gguf/Gpt-Oss-32x2.4B-F16.gguf /home/seeed/Documents/gpt-oss-gguf-Q4/Gpt-Oss-32x2.4B-Q4.gguf Q4_K
# ./build/bin/llama-quantize <f16_gguf_模型的路徑> <輸出模型的路徑> <量化方法>
你也可以在HuggingFace找到別人量化好的各種精度的gguf
格式模型,直接下載可以跳過上面的轉換/量化步驟:
https://huggingface.co/unsloth/gpt-oss-20b-GGUF/tree/main
gpt-oss原生的模型中一些算子本來就才用了壓縮的精度(例如mxfp4精度)
所以量化后模型沒有明顯的變小。
模型推理與benchmark
在llama.cpp
目錄下,啟動cli進行推理測試,-ngl 40
表示模型的前40層在GPU上運行,所以當模型較小時,這個參數設置到某個閾值就不會再提升推理速度:
./build/bin/llama-cli -m /home/seeed/Documents/gpt-oss-gguf/Gpt-Oss-32x2.4B-F16.gguf -ngl 40
啟動后可以在終端中向gpt提問
使用llama.cpp
做benchmark,測試推理速度,batch-size
提高也會提升測速結果:
./build/bin/llama-bench -m /home/seeed/Documents/gpt-oss-gguf/Gpt-Oss-32x2.4B-F16.gguf -ngl 40 --batch-size 2048
GUI交互
啟動llam-server
,提供后端推理服務,記得把之前的llama-cli
關掉:
./build/bin/llama-server -m /home/seeed/Documents/gpt-oss-gguf/Gpt-Oss-32x2.4B-F16.gguf -ngl 40
如果希望通過 UI 界面訪問模型,可以在 Jetson 上安裝 OpenWebUI 來實現。
打開一個新的終端并輸入以下命令,安裝并啟動OpenWebUI:
pip install open-webui
open-webui serve
然后,打開您的瀏覽器并導航到 http://<jetson的ip地址>:8080
來啟動 Open WebUI。如果使用本地回環就設置為127.0.0.1
這個地址。
轉到 ?? Admin Settings → Connections → OpenAI Connections,將 url 設置為:http://127.0.0.1:8081。保存后,Open WebUI將開始使用本地的Llama.cpp
服務器作為后端
總結
gpt-oss,需要使用8月份之后release的llama.cpp
才能推理,目前該模型量化的壓縮效果不明顯。