精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

從通用到專精 - 聚焦? LLMOps 全流程

原創 精選
人工智能
本文聚焦 LLMOps(大模型運維)全流程實踐,從一大模型微調的例子切入,串聯起從數據準備到模型部署落地的完整鏈路。通過模擬業務人員上傳微調數據,借助 Jenkins 工作流驅動一系列自動化操作,展現大模型從研發優化到實際應用的全生命周期管理邏輯,幫大家理解大模型開發微調中如何實現 LLMOps 的全流程。

作者 | 崔皓

審校 | 重樓

整體思路

本文聚焦 LLMOps(大模型運維)全流程實踐,從一大模型微調的例子切入,串聯起從數據準備到模型部署落地的完整鏈路。通過模擬業務人員上傳微調數據,借助 Jenkins 工作流驅動一系列自動化操作,展現大模型從研發優化到實際應用的全生命周期管理邏輯,幫大家理解大模型開發微調中如何實現 LLMOps 的全流程。

例子通過模型微調的方式,讓 Qwen2 大模型 “認知” 自身為 “微調小助手,由小明創造”。依托 LLaMA - Factory 完成模型微調,讓 Qwen2 學習特定身份設定;通過自定義腳本合并模型、利用 llama.cpp 轉換格式,適配部署需求;再經 MLflow 實現模型注冊、評估,構建 Docker 鏡像并部署為容器,最終通過測試驗證模型功能與性能。全流程以 Jenkins 為自動化引擎,串聯參數驗證、微調、合并、轉換、注冊、評估、鏡像生成、容器部署、測試九大環節,形成完整閉環。

為了方便大家了解整個案例的執行流程, 我們通過如下一張大圖讓大家了解。

這里對圖中涉及到的步驟進行詳細描述:

  • 驗證參數:對模型全流程涉及的參數(如微調配置、轉換參數等)進行合法性校驗,確保流程穩定運行。
  • 微調模型:基于 LLaMA-Factory 執行大模型微調任務,針對特定場景/數據優化模型效果。
  • 合并模型:通過自定義 Python 腳本,將微調后的模型與基礎模型合并,整合優化成果。
  • 轉換模型:利用 llama.cpp 工具,把模型轉換為目標格式(如 GGUF 格式 ),適配后續部署需求。
  • 注冊模型:將轉換后的模型登記到模型倉庫(如 MLflow 模型注冊表 ),實現版本化管理。
  • 評估模型:借助 MLflow 工具鏈,對模型開展性能評估(如指標計算、結果分析),并記錄評估數據。
  • 生成鏡像:依托 MLflow 構建能力,打包包含模型推理服務的 Docker 鏡像,固化運行環境。
  • 部署容器:將 Docker 鏡像部署為容器實例,使模型推理服務可對外提供穩定訪問。
  • 測試模型:對容器化部署的模型進行功能、性能測試,驗證服務可用性與推理效果。

通過上述流程,將呈現大模型如何從 “通用能力” 向 “場景化定制” 演進。可以通過該實踐案例,理解 LLMOps 如何用自動化串聯模型迭代全環節,每個技術步驟如何服務業務目標,以及大模型從數據輸入到可用服務的完整實現邏輯,為實際業務中模型迭代與落地提供可參考的流程范式。

應用安裝

在開始 LLMOps 實踐前,需先搭建穩固的工具鏈底座。本章聚焦核心組件的安裝與準備,這些組件將支撐從模型微調、轉換到部署測試的全流程。為了讓大多數人能夠通過本文檔體驗 LLMOps 的全過程,我們選擇了 Windows 平臺,使用 Win 10/11 作為操作系統,顯卡方面使用了一張 4060 的 8G 現存的顯卡。顯卡的選取根據具體情況,由于我們會涉及到大模型微調的部分,帶現存的顯卡體驗會好一些。

安裝組件基本介紹

在安裝組件之前我們通過如下一張大圖讓大家了解, 這些組件在哪些實踐環節中起效。

這里我們將安裝的工具和組件進行分類,給大家介紹。

基礎環境

我們的技術棧圍繞 Jenkins、Git、Anaconda、Python 構建自動化與運行環境,它們是流程運轉的 “發動機”。Jenkins 作為自動化工作流核心,負責串聯起模型微調、合并、轉換等全環節;Git 保障代碼與數據版本可控;Anaconda 與 Python 則為模型開發提供虛擬環境與編程語言支持,讓不同工具間的依賴管理更清晰。

關鍵組件

(一)微調與加速:CUDA + LLaMA - Factory

模型微調是讓 Qwen2 “學習身份” 的關鍵一步。借助 CUDA 發揮 GPU 算力優勢,可大幅縮短微調時間。而 LLaMA - Factory 作為專業微調框架,提供便捷的參數配置與訓練流程,讓我們能高效用數據集訓練模型,賦予其 “微調小助手,由小明創造” 的認知。需確保 CUDA 版本與硬件、深度學習框架適配,再通過 Python 環境安裝 LLaMA - Factory 及依賴,為模型微調鋪好路。

(二)格式轉換:llama.cpp

完成微調與模型合并后,為適配多樣化部署場景,需用 llama.cpp 轉換模型格式(如轉為 GGUF 格式 )。它能讓模型在不同硬件環境(尤其是輕量化部署場景)更易運行。安裝時,通過 Git 拉取源碼并編譯,依據硬件配置調整編譯參數,確保轉換后的模型能穩定支持后續流程。

(三)模型全生命周期管理:MLFlow

MLFlow 貫穿模型注冊、評估、鏡像生成環節,是模型全生命周期管理的 “中樞”。注冊模型時,它記錄版本與元數據,方便迭代追溯;評估環節,借助其工具鏈計算性能指標;生成鏡像階段,又能打包模型與推理服務。通過 Python 包管理工具安裝 MLFlow,配置好跟蹤服務器,就能讓模型從研發到部署的關鍵節點可管、可查。

部署測試

(一)容器化部署:Docker

模型要對外提供服務,Docker 是容器化部署的首選。它能封裝模型推理環境,確保不同環境下運行一致。安裝 Docker 引擎后,配置鏡像構建與容器運行參數,后續結合 MLFlow 生成的模型,快速打包成可部署的鏡像。

(二)功能測試:Streamlit

最終驗證模型功能(如身份認知回復是否符合預期 ),Streamlit 是輕量且便捷的工具。它能快速搭建 Web 測試界面,輸入指令驗證模型輸出。通過 Python 安裝 Streamlit,編寫簡單腳本加載部署后的模型,就能直觀測試模型在實際交互中的表現。

這些組件并非孤立存在,而是相互協作:Jenkins 驅動流程,調用 LLaMA - Factory 微調、llama.cpp 轉換;MLFlow 記錄模型演進;Docker 與 Streamlit 完成最后部署與驗證。

安裝 CUDA

CUDA(Compute Unified Device Architecture,統一計算設備架構)是 NVIDIA 推出的專為其 GPU(圖形處理器)設計的并行計算平臺與編程模型。在實戰中,CUDA 提供硬件加速支撐:例如使用 LLaMA-Factory 進行模型微調時,會通過 CUDA 接口調用 GPU 核心,在 llama.cpp 進行模型格式轉換(如 FP16 轉 FP8)或推理時,CUDA 也能加速數值計算過程,降低模型部署后的響應延遲。同時,CUDA 配套提供了 CUDA Toolkit(包含編譯器、庫、驅動等),確保深度學習框架與 NVIDIA GPU 之間的高效適配。

需要說明的是, 本次實踐使用的是 NVIDIA 4060 的顯卡,所以需要在安裝顯卡驅動的基礎上再安裝 CUDA 套件,從而支持上層的向量運算。

在安裝之前,需要通過Nvidia Control Panel查看當前顯卡驅動支持的最高 CUDA 版本。如下圖所示打開Nvidia Control Panel。

點擊“系統信息”,在彈出的對話框中查看支持的最高CUDA版本,這里顯示的 CUDA 是 12.6 版本,不同的顯卡這里支持的 CUDA 版本不同。

接著,如下圖所示,下載支持的CUDA版本安裝包 CUDA Toolkit Archive

下載完 CUDA toolkit 之后還沒有完,需要安裝與之相關的其他依賴以及套件,訪問https://pytorch.org/get-started/locally/ 根據你所加載的操作系統,安裝指令包語言以及 CUDA 的版本生成命令。

直接把生成的命令,放到 powershell 中執行,記住在執行之前激活 mlflow 的環境,后面我們都會在這個虛擬環境中工作。

conda activate mlflow
 pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126

執行命令之后,你會看到如下圖片的輸出內容,表示正在下載依賴。

完成上述操作之后需要重啟操作系統,然后打開 powershell 執行如下命令,查看 CUDA 版本。

nvcc --version

如下圖所示,輸出CUDA 編譯器版本。

此時如果還不放心,可以通過如下 Python 腳本查看CUDA是否可用。我們可以在 mlflow 目錄下面創建test_cuda.py 文件。需要說明的是,這個所謂的mlflow 目錄會存放一些相關的重要文件,我這里選擇 D:\mlflow 目錄,后面一些重要的測試文件和腳本文件我也會放到這里。并且,類似 Llama-Factory,llama.cpp 等開源工具也會安裝到這個目錄方便管理和講解。

import torch
 import subprocess

 def run_cmd(cmd):
 try:
 result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
 return result.stdout.strip()
 except Exception as e:
 return str(e)

 print("==== [CUDA / GPU 檢查腳本] ====\n")

 # 1. 檢查 nvidia-smi
 print(">>> 驅動 (nvidia-smi):")
 nvidia_smi_output = run_cmd("nvidia-smi")
 if nvidia_smi_output:
 print(nvidia_smi_output)
 else:
 print("未檢測到 nvidia-smi,請檢查顯卡驅動是否安裝正常。\n")

 # 2. PyTorch 版本信息
 print("\n>>> PyTorch 版本信息:")
 print(f"torch.__version__ = {torch.__version__}")
 print(f"torch.version.cuda = {torch.version.cuda}")
 print(f"torch.backends.cudnn = {torch.backends.cudnn.version()}\n")

 # 3. CUDA 可用性
 print(">>> CUDA 可用性:")
 print(f"torch.cuda.is_available() = {torch.cuda.is_available()}")
 print(f"torch.cuda.device_count() = {torch.cuda.device_count()}")

 if torch.cuda.is_available():
 print(f"當前 GPU: {torch.cuda.get_device_name(0)}")
 print(f"GPU 計算能力: {torch.cuda.get_device_capability(0)}")
 else:
 print("?? PyTorch 沒有檢測到可用的 CUDA/GPU。\n")

 print("\n==== 檢查結束 ====")

執行如下命令:

conda activate mlflow
 python test_cuda.py

得到下圖輸出,說明CUDA已啟用,并且列舉詳細參數。

安裝 Jenkins

Jenkins 是本次大模型全流程實戰的核心樞紐,它憑借 pipeline 機制,將微調、合并、轉換、評估、測試、部署等分散的工具與框架緊密串聯。

接下來,如下圖所示通過網站 https://www.jenkins.io/download/ 進行選擇并安裝。

需要注意的是在安裝 Jenkins 之前需要下載并安裝 JDK 23,在 Jenkins 的安裝過程中會選擇 JDK 所安裝的文件夾。另外, Jenkins 在安裝的時候會提供一個 WebUI 的訪問端口,默認是 8080。為了避免沖突,我在安裝的時候將其設置為 8081,大家可以根據具體情況酌情設置,這個 WebUI 的訪問地址在后面實踐中會用到,大部分的配置操作會在上面進行。

Jenkins 安裝完畢之后,如下圖所示, 通過 Windows 中的“服務”查看其正常運行即可。

在確保服務啟動的同時,還需要在瀏覽器輸入http://localhost:8081,這個地址和端口是我們在安裝時設定的。由于第一次訪問 Jenkins 的 WebUI,所以需要進行用戶名和密碼的初始化設置。如下圖所示,在初次訪問的時候,會提示用戶到指定文件中獲取管理員的密碼。由于每個人的安裝目錄不同,假設我們將 Jenkins 安裝到了D:/jenkins_home 下,那么文件就是D:/jenkins_home/secrets/initialAdminPasswrod 。

接著會完成管理員和密碼的設置,完成設置之后如下圖所示我們會安裝自定義插件。選擇“安裝推薦的插件”進行安裝。

如下圖所示,會顯示插件安裝的過程,這里只需要等待安裝完成即可。

安裝 Anaconda

在介紹完 Jenkins 的安裝之后,我們來到 Anaconda 的安裝。Anaconda 是一個針對數據科學、機器學習及深度學習場景設計的開源包管理與環境管理工具,它整合了 Conda 包管理器、Python 解釋器以及大量常用的數據科學庫(如 NumPy、Pandas、Scikit-learn 等),能為開發者提供統一、穩定的開發環境。

在本次大模型全流程實戰中,Anaconda 的核心作用是創建并管理獨立的 Python 虛擬環境(如專門用于 MLflow 評估的 mlflow 環境、用于 LLaMA-Factory 微調的環境等),避免不同工具間的依賴版本沖突。同時,借助 Anaconda 的命令行工具,還能快速完成環境的創建、激活、包安裝與更新,為整個 LLMOps 流程的依賴管理提供穩定支撐。

注意:如果不需要做環境隔離,或者本機已經有類似的管理工具,可以跳過 Anaconda 的安裝。

如下圖所示,通過官網下載最新版本Download Success | Anaconda

雙擊安裝文件,然后如下圖所示,一頓操作不斷“下一步”對其進行安裝,只需要注意安裝目錄即可。

修改安裝目錄,默認C盤,建議修改到空間比較大的其他盤,這里是改到D盤下。

在安裝完畢之后,需要激活 conda 的虛擬環境,如下圖所示,通過“終端管理員”運行PowerShell。

輸入如下命令,進入conda安裝目錄,假設我們安裝在 C 盤。

cd 'c:\ProgramData\anaconda3\Library\bin\'

在使用conda命令之前需要對其進行初始化設置,執行如下命令。

.\conda init

一個小插曲,我在 windows 中安裝涉及權限問題,需要通過如下命令修改執行策略。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

完成上述操作之后,再重新打開PowerShell,如下圖所示在命令行的最左邊顯示(base),說明環境配置成功。

安裝好 Conda 之后,我們會使用 Conda 命令創建虛擬環境,大多數的組件和工具的安裝都包含在虛擬環境中,大家跟上別掉隊。

安裝 MLflow

MLflow 是一個開源的機器學習生命周期管理工具,主要用于簡化機器學習模型從開發、訓練、評估到部署的全流程管理。在本次大模型實戰中,MLflow 承擔著多重核心角色:在模型管理層面,它提供模型注冊表功能,可對微調、合并后的模型進行版本化記錄與管理,方便追溯不同版本模型的迭代歷史;在模型評估層面,能集成毒性、文本可讀性等指標計算邏輯,自動生成評估報告并記錄指標結果,支持后續對比分析;在模型部署層面,可基于已管理的模型自動生成包含推理服務的 Docker 鏡像配置,為后續容器化部署提供基礎。說白了,MLFlow 在幫助管理模型的生命周期,并對其進行管理和記錄。

這里我們會通過 conda 創建虛擬環境進行安裝,之后組件的安裝都會基于虛擬環境(mlflow),這里統一做一次說明。

打開PowerShell,執行如下命令創建名為 “mlflow”的虛擬環境,python版本選擇3.10.18。

conda create -n mlflow pythnotallow=3.10.18

創建完畢之后激活環境,執行如下代碼:

conda activate mlflow

在激活的環境中,執行如下命令安裝mlflow 組件以及相關依賴。

pip install mlflow

如果不出意外 mlflow 已經安裝好了,可以通過如下命令啟動 mlflow。

mlflow server --backend-store-uri file:///d:/mlflow/mlruns --artifacts-destination file:///d:/mlflow/mlartifacts --default-artifact-root file:///d:/mlflow/mlartifacts --host 127.0.0.1 --port 8082

命令內容有點長,嘗試給大家解釋一下。

該命令用于啟動 MLflow 跟蹤服務器,所以以 mlflow server 開頭,后面跟了一系列參數:

  • --backend-store-uri file:///d:/mlflow/mlruns 設定后端存儲路徑,用于保存實驗元數據(如運行記錄、參數、指標等)到本地 d:/mlflow/mlruns 目錄;
  • --artifacts-destination 和 --default-artifact-root 均指定為 file:///d:/mlflow/mlartifacts,定義了模型 artifacts(如權重文件、配置文件等)的存儲路徑;
  • --host 127.0.0.1 和 --port 8082 則限制服務器僅在本地(127.0.0.1)的 8082 端口提供服務,確保只有本機可訪問該 MLflow 服務器。

執行上述命令之后, mlflow 也就啟動了,也可以通過 http://localhost:8082 訪問 mflow 的 WebUI。

安裝 Git

由于需要通過 Git 命令拉取諸如 Llama-Factory 開源項目,可以通過地址 Git - Downloading Package完成 Git 的下載,雙擊Git-2.50.1-64-bit.exe,按默認選項完成安裝。這里不展開描述。

安裝 LLaMA-Factory

Git 的安裝主要是為了后面兩個開源工具做準備的,下面就輪到 Llama factory 的安裝了。 LLaMA-Factory 是一個開源的大模型微調框架,專注于簡化 LLaMA 系列及衍生大模型的微調流程,提供了一站式的模型微調、評估與部署解決方案。它集成了多種主流微調方法(如全參數微調、LoRA 等參數高效微調技術),支持通過配置文件或命令行參數快速設定微調策略(如學習率、訓練步數、批處理大小等),降低了大模型微調的技術門檻。

在本次大模型實戰中,LLaMA-Factory 主要用于加載基礎模型(如 Qwen2)和定制化數據集(包含 “身份認知” 相關指令),執行微調任務以讓模型學習 “微調小助手,由小明創造” 的角色設定,同時支持在微調過程中利用 CUDA 進行 GPU 加速,提升訓練效率,最終輸出微調后的模型權重,為后續的模型合并環節提供基礎。

通過下面命令激活環境,并且利用 git 拉取 Llama factory 并進行安裝。注意,這里我們將其安裝到了d:\mlflow 目錄下面,方便后續管理。

conda activate mlflow
 cd d:\mlflow
 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
 cd LLaMA-Factory 
 pip install -e ".[torch,metrics]"

如果安裝過程中遇到下載不了的情況,需要通過代理完成下載,或者使用鏡像拉取,這里不展開說明。這里我們選擇 Clash,此時在PowerShell中輸入如下命令, 保證 git 命令能夠順利執行。如果沒有對應網絡問題,可以跳過這個部分。

$env:HTTP_PROXY="http://127.0.0.1:7890"
 $env:HTTPS_PROXY="http://127.0.0.1:7890"

安裝完畢之后,執行以下命令測試 LLaMA-Factory WebUI 是否正常運行。此時定位到 d:/mlflow/LLaMA-Factory 目錄下面執行。

python src/webui.py

你會看到如下輸出信息,說明LLaMA-Factory 的服務已經啟動了。

Visit http://ip:port for Web UI, e.g., http://127.0.0.1:7860
 * Running on local URL: http://0.0.0.0:7860
 * To create a public link, set `share=True` in `launch()`.

此時,通過 localhost:7860 就可以訪問 LLaMA-Factory 了,不過這里暫時不會用到, 后面會通過命令行的方式調用它。

安裝 llama.cpp

由于我們實踐的是 LLMOps 的全流程,中間涉及到的工具和組件較多,所以整個過程比較漫長,終于來到了最后一步,就是安裝 llama.cpp。

llama.cpp 是一個輕量級的開源框架,主要用于大模型的高效推理與格式轉換,尤其適用于在 CPU 或資源受限的硬件環境中運行模型。它支持多種大語言模型,并提供了模型格式轉換工具,能夠將不同格式的模型文件轉換為其專用的 GGUF 格式,同時優化模型的加載與推理性能。

在本次實戰中,我們會用到 llama.cpp 的模型轉換功能。需要轉換的源文件是 safetensors 格式,它是一種安全的張量存儲格式,專為機器學習模型設計,具有防篡改特性,能有效避免惡意代碼注入,目前被廣泛用于存儲模型權重,從 LLaMA-Factory 微調后輸出的模型文件即為此格式。通過 llama.cpp 提供的轉換工具(如 convert_hf_to_gguf.py),我們將 safetensors 格式的模型文件轉換為 GGUF 格式。GGUF 格式是一種更通用的模型存儲格式,它對模型權重和元數據進行了統一封裝,適配性更強,可在不同硬件環境(包括 CPU、GPU 及邊緣設備)中更高效地加載和運行,且支持多種推理框架。

需要說明的是,模型格式轉換并非必需步驟,直接使用 safetensors 格式的模型進行部署也是可行的;但通過演示這一轉換過程,我們可以展示大模型在落地時的更多可能性,包括如何適配多樣化的硬件環境,為實際應用中的格式選擇提供參考。

依舊通過如下指令安裝llama.cpp。

conda activate mlflow
 cd E:\mlflow
 git clone https://github.com/ggerganov/llama.cpp.git
 cd llama.cpp\gguf-py
 pip install --editable .
 pip install mistral-common

看到如下字樣說明安裝成功了。

WARNING: Ignoring invalid distribution -lflow (d:\programdata\anaconda3\envs\mlflow\lib\site-packages)
 WARNING: Ignoring invalid distribution -lflow-skinny (d:\programdata\anaconda3\envs\mlflow\lib\site-packages)
 Installing collected packages: gguf
 Attempting uninstall: gguf
 Found existing installation: gguf 0.17.1
 Uninstalling gguf-0.17.1:
 Successfully uninstalled gguf-0.17.1
 WARNING: Ignoring invalid distribution -lflow (d:\programdata\anaconda3\envs\mlflow\lib\site-packages)
 WARNING: Ignoring invalid distribution -lflow-skinny (d:\programdata\anaconda3\envs\mlflow\lib\site-packages)
 Successfully installed gguf-0.17.1

配置 Jenkins

在完成全流程所需組件與工具的安裝后,接下來需將這些分散的技術模塊整合為自動化執行鏈路,核心在于將工具調用邏輯嵌入 Jenkins 并完成對應配置,因此我們的關注點將轉移至 Jenkins 的具體設置。考慮到本次 LLMOps 實踐涵蓋參數驗證、模型微調、合并、轉換、注冊、評估、鏡像生成、容器部署、測試共 9 個步驟,需依托 Jenkins 的 Pipeline 機制實現全流程串聯:Jenkins Pipeline 是一種基于代碼的工作流定義方式,支持將多環節任務按順序編排為可復用、可版本控制的腳本,能自動觸發各步驟執行并處理環節間的依賴關系,避免人工干預導致的流程中斷或遺漏。同時,為適配不同場景下的 LLMOps 需求(如更換基座模型、使用不同微調數據集),還需為 Pipeline 設計客制化輸入參數,例如基座模型在本地或遠程存儲的具體地址、業務人員上傳的微調數據集文件路徑、MLflow Server 的訪問地址等,通過參數化配置讓 Pipeline 具備更強的靈活性,滿足多樣化的模型迭代與部署需求。

創建Pipeline

首先創建 Jenkins 的 Pipeline 類型的任務, 如下圖所示,通過 localhost:8081 訪問 Jenkins 的 WebUI 界面, 點擊“新建 Item”進行 Pipeline 的設置。 需要注意的是, localhost:8081 需要和之前安裝Jenkins 時定義的訪問地址保持一致。

接著根據下圖,在新建 Item 中輸入一個任務的名稱,按照個人喜好設置就可以了。記得選擇 Pipeline 作為任務的類型。

在點擊“確定”之后會看到如下圖所示界面。這里的“腳本”我們會在后續進行填寫,這里知道就行了,繼續點擊“Save”。

安裝插件

我們已經創建了 Jenkins Pipeline類型的任務,由于該任務會接受數據集文件作為大模型微調的輸入,而數據集文件的格式是 JSON,所以需要讓 Jenkins 能夠識別并解析該文件格式。于是,我們需要安裝兩個插件來滿足文件上傳和解析的需求,如下圖所示,在 Jenkins 的 WebUI 界面點擊右上方的“齒輪”(設置)按鈕,選擇“Plugins”進行,(File Parameter)文件上傳和文件解析(Pipeline Utility Steps)插件的安裝。

在界面中選擇“Available plugins”,然后輸入“File Parameter”在下方列表中勾選插件,然后點擊最右邊的“安裝”按鈕。

由于安裝需要一點時間,如下圖所示,點擊“安裝完成后啟動 Jenkins”。

按照上面相同的步驟,把“Pipeline Utility Steps” 也安裝起來,這里就不再重復安裝步驟了,大家自行安裝并重啟 Jenkins。

設置參數

前面安裝 Jenkins 插件的目的是為了支持文件上傳以及解析 Json 格式的文件, 接下來就需要設置輸入的參數了。在生產環境中,Jenkins 定義的 Pipeline 任務更像一個工作流,會按照既定的步驟逐一執行直到結束,該工作流獲取外部信息的方式就是參數輸入,接下來就來看有哪些參數需要設置。

如下圖所示,在我們之前創建的“item” Pipeline 中選擇“配置”。

在左側的“General”菜單中選擇“This project is parameterized”,意思是針對這個項目進行參數化。

緊接著在下面的“添加參數”下拉框中選擇“Stashed File Parameter”,意思是可以將上傳文件作為參數輸入,稍后我們會將微調文件作為參數輸入。

如下圖所示,在展開“Stashed File Parameter”參數中可以輸入“DATASET_FILE”作為 Name,也就是說上傳的文件會保存到名為“DATASET_FILE”的工作空間變量中。

Jenkins 的工作空間(Workspace)是指 Jenkins 服務器在執行任務(如 Pipeline、自由風格項目等)時,為當前任務動態分配的一個本地文件目錄,用于存放任務執行過程中所需的代碼、數據、依賴文件及輸出結果。它是任務運行的 “臨時工作目錄”,每個任務在執行時都會擁有獨立的工作空間,避免不同任務間的文件沖突。

接下來添加幾個字符串類型的參數,如下圖所示,選擇“String Parameter”。

輸入名稱為“MLFLOW_TRACKING_URI”的參數,給出一個默認值為“http://127.0.0.1:8082” ,也就是 MLflow 服務器的訪問地址。如果還有記憶的話,我們在“安裝 MLflow”的環節會啟動這個 MLFlow,用的就是本地的 8082 端口。由于每個人安裝的MLFlow 服務的地址各不相同,所以這里需要進行配置。

接著就是模型文件所載目錄,通過 “MODEL_NAME_OR_PATH”進行配置。在測試環節,我們會嘗試下載大模型 Qwen2-0.5b ,并存放到下圖所示的目錄中。

在配置的最后,設置“ MODEL_NAME”用來標注在 MLflow 中所注冊的模型名稱。在 MLflow 注冊之后就可以查看評估結果,以及可以對模型進行后續操作。

好了,至此我們就完成了 Pipeline 任務的參數設置,當然我們還可以加入更多參數,這里全當拋磚引玉,在實際項目中可以自由發揮。

編寫腳本

Jenkins Pipeline 腳本以代碼化方式定義整個工作流程,核心功能在于將分散的步驟串聯為自動化鏈路,同時支持靈活調用外部腳本(如 Python 文件),實現復雜流程的有序執行。

從步驟串聯來看,Pipeline 腳本通過結構化語法(如 stage 塊)將不同環節按邏輯組織,例如在本次 LLMOps 實踐中,可通過 stage('模型微調') 定義微調環節,各環節按腳本順序依次執行。

同時,Pipeline 腳本具備強大的外部調用能力,可直接在腳本中通過命令行語法調用其他 Python 文件。例如,在 “合并模型” 環節,腳本中可寫入類似 python merge_lora_model.py 命令完成。這種調用方式讓 Pipeline 無需重復編寫復雜邏輯,只需專注于流程調度,而具體功能實現可交由專業腳本處理,既簡化了 Pipeline 腳本的復雜度,又提高了代碼的復用性與可維護性。

簡言之,Pipeline 腳本既是流程的 “串聯者”,負責按序調度各環節;也是 “集成者”,通過調用外部 Python 腳本拓展功能邊界,最終實現從參數驗證到模型部署的全流程自動化。

具體而言在我們的 LLMOps 的實踐中,定義了一套完整的大模型全流程自動化工作流,涵蓋從參數驗證到容器化部署及接口測試的 9 個核心環節,實現了大模型微調、合并、轉換、評估、部署的端到端自動化。

整體腳本分為兩大部分:

  • environment :統一配置了全流程所需的環境變量(如編碼格式、路徑信息、Conda 環境等),確保各環節參數一致;
  • stages :定義了 9 個階段。首先通過 “驗證參數” 階段校驗輸入合法性(如 MLflow 地址、數據集格式等),確保流程輸入合規;隨后依次執行 “LLaMAFactory 微調”(調用 LLaMA-Factory 框架進行模型微調)、“合并 Lora 和預訓練模型”(通過自定義 Python 腳本整合模型)、“轉換模型格式為 gguf”(利用 llama.cpp 轉換模型格式);接著完成 “注冊合并后模型到 MLflow”(將模型納入版本管理)、“模型評估”(調用評估腳本記錄指標);最后通過 “生成 docker 鏡像”“部署到 Docker 容器”“測試容器接口” 完成模型的容器化部署與功能驗證。

先放整體腳本,然后在分environment 和 stages講解。

pipeline {
 agent any
 
 environment {
 // 設置UTF-8編碼環境變量
 JAVA_TOOL_OPTIONS = "-Dfile.encoding=UTF-8"
 // Python 環境變量,用于控制 Python 程序的 標準輸入/輸出(stdin/stdout/stderr)的默認編碼
 PYTHONIOENCODING = "UTF-8"
 // MLflow 存儲模型和文件(Artifacts)的默認位置
 MLFLOW_ARTIFACT_URI = 'file:///d:/mlflow/mlartifacts'
 // 微調數據集保存地址
 DATASET_URI = 'd:\\mlflow\\LLaMA-Factory\\data\\custom.json'
 // llama-factory目錄
 LLAMA_FACTORY_PATH = 'd:\\mlflow\\LLaMA-Factory'
 // llama-factory微調模型保存目錄(LLAMA_FACTORY_PATH下的目錄)
 TRAIN_OUTPUT_PATH = 'saves\\Qwen2-0.5B\\lora'
 // 模型合并后保存目錄
 MERGED_PATH = 'd:\\mlflow\\merge'
 // 運行環境數據根目錄
 ROOT_PATH = 'd:\\mlflow'
 // 定義 Conda 激活命令的路徑(注意 Windows 路徑轉義)
 CONDA_ACTIVATE = "c:\\ProgramData\\anaconda3\\condabin\\activate.bat"
 // Conda 環境名稱
 CONDA_ENV = "mlflow"
 // 評估數據集
 EVAL_DATA = 'd:\\mlflow\\myTrain.json'
 // 定義容器名稱和鏡像名稱(根據實際情況修改)
 CONTAINER_NAME = "llm_test"
 }
 
 stages {
 stage('驗證參數') {
 steps {
 script {
 if (!params.MLFLOW_TRACKING_URI) {
 error "MLFLOW_TRACKING_URI 不能為空"
 }
 
 if (!env.DATASET_FILE_FILENAME) {
 error "未上傳用于微調的數據集"
 }
 
 // 文件驗證
 if (env.DATASET_FILE_FILENAME) {
 echo "上傳文件: ${DATASET_FILE_FILENAME}"
 // 1. 判斷文件格式
 if (!env.DATASET_FILE_FILENAME.endsWith('.json')) {
 error "只接受 .json 文件,當前文件: ${DATASET_FILE_FILENAME}"
 }
 // 2. 自動從stash恢復
 unstash 'DATASET_FILE'
 
 // 3. 獲取文件路徑
 def filePath = "${env.WORKSPACE}\\DATASET_FILE"
 
 // 4. 讀取文件內容
 def content = readFile(file: filePath, encoding: env.PYTHONIOENCODING)
 
 // 4.1. 解析為JSON對象
 def json
 try {
 json = readJSON(text: content)
 } catch (Exception e) {
 error "無效的JSON格式: ${e.message}"
 }
 
 // 4.2. 驗證數據結構
 if (!(json instanceof List)) {
 error "根元素必須是數組"
 }
 
 json.eachWithIndex { item, index ->
 // 4.2.1 檢查每項是否為對象
 if (!(item instanceof Map)) {
 error "第${index+1}項不是對象"
 }
 
 // 4.2.2 檢查必需字段
 def requiredFields = ['instruction', 'input', 'output']
 requiredFields.each { field ->
 if (!item.containsKey(field)) {
 error "第${index+1}項缺少必需字段: ${field}"
 }
 }
 }
 
 echo "JSON 格式驗證通過"
 
 // 5. 復制文件到數據集所在目錄
 bat """copy "${filePath}" "${DATASET_URI}" """
 }
 }
 }
 }
 
 stage('LLaMAFactory 微調') {
 steps {
 bat """
 @echo off
 REM 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 REM 切換到項目目錄
 cd /d "${ROOT_PATH}\\LLaMA-Factory"
 
 REM 執行訓練命令(注意換行符使用^)
 llamafactory-cli train ^
 --stage sft ^
 --do_train True ^
 --model_name_or_path ${params.MODEL_NAME_OR_PATH} ^
 --preprocessing_num_workers 16 ^
 --finetuning_type lora ^
 --template default ^
 --flash_attn auto ^
 --dataset_dir ${LLAMA_FACTORY_PATH}\\data ^
 --dataset dataset ^
 --cutoff_len 2048 ^
 --learning_rate 5e-05 ^
 --num_train_epochs 20 ^
 --max_samples 100000 ^
 --per_device_train_batch_size 2 ^
 --gradient_accumulation_steps 8 ^
 --lr_scheduler_type cosine ^
 --max_grad_norm 1.0 ^
 --logging_steps 5 ^
 --save_steps 100 ^
 --warmup_steps 0 ^
 --packing False ^
 --enable_thinking True ^
 --report_to none ^
 --output_dir ${TRAIN_OUTPUT_PATH} ^
 --bf16 True ^
 --plot_loss True ^
 --trust_remote_code True ^
 --ddp_timeout 180000000 ^
 --include_num_input_tokens_seen True ^
 --optim adamw_torch ^
 --lora_rank 8 ^
 --lora_alpha 16 ^
 --lora_dropout 0 ^
 --lora_target all
 """
 }
 }
 
 stage('合并Lora 和 預訓練模型') {
 steps {
 bat """
 REM 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 REM 開始合并模型
 python "${ROOT_PATH}\\merge_lora_model.py" ^
 --base_model "${params.MODEL_NAME_OR_PATH}" ^
 --lora_path "${LLAMA_FACTORY_PATH}\\${TRAIN_OUTPUT_PATH}" ^
 --output_dir "${MERGED_PATH}"
 """
 }
 }
 stage('轉換模型格式為gguf') {
 steps {
 bat """
 REM 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 REM 切換到llama.cpp目錄
 cd /d "${ROOT_PATH}\\llama.cpp"

 REM 判斷convert目錄是否存在,不存在則創建
 if not exist "${ROOT_PATH}\\convert" (
 md "${ROOT_PATH}\\convert"
 echo 創建convert目錄成功
 ) else (
 echo convert目錄已存在
 )
 
 REM 開始轉換模型格式
 python convert_hf_to_gguf.py "${MERGED_PATH}" --outfile "${ROOT_PATH}\\convert\\merge-auto.gguf"
 """
 }
 }
 
 stage('注冊合并后模型到MLflow') {
 steps {
 script {
 bat """
 REM 激活Conda環境并檢查
 call "${CONDA_ACTIVATE}" ${CONDA_ENV} || (echo Conda環境激活失敗 && exit 1)
 
 REM 執行注冊腳本,輸出日志到文件
 python "${ROOT_PATH}\\register_model.py" ^
 --model-name "${params.MODEL_NAME}" ^
 --model-dir "${MERGED_PATH}" ^
 --experiment "${params.MODEL_NAME}" ^
 --tracking-uri "${params.MLFLOW_TRACKING_URI}" ^
 > register_log.txt 2>&1 || (echo 模型注冊失敗 && exit 1)
 """
 
 // 從日志提取版本號
 def logContent = readFile(file: 'register_log.txt', encoding: env.PYTHONIOENCODING)
 // 正則表達式:同時匹配 "version 2" 和 "Created version '2'" 格式
 // (\d+) 表示捕獲數字版本號
 def versionMatch = (logContent =~ /version (?:')?(\d+)(?:')?/)
 
 if (versionMatch.find()) { // 使用find()而非matches(),匹配日志中任意位置的版本號
 env.MODEL_VERSION = versionMatch.group(1) // 獲取第一個捕獲組(版本號)
 echo "提取到模型版本: ${env.MODEL_VERSION}"
 } else {
 error "未從日志中找到模型版本,日志內容: ${logContent}"
 }
 }
 }
 }
 
 stage('模型評估(合并后模型)') {
 steps {
 bat """
 REM 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 cd /d "${ROOT_PATH}"
 python evaluate.py --model-name ${params.MODEL_NAME} --eval-data "${EVAL_DATA}" --experiment "${params.MODEL_NAME}" --tracking-uri ${params.MLFLOW_TRACKING_URI}"
 """
 }
 }
 
 stage('生成docker鏡像(合并后模型)') {
 steps {
 withCredentials([usernamePassword(credentialsId: 'dockerhub-creds', 
 usernameVariable: 'DOCKER_USER', 
 passwordVariable: 'DOCKER_PASS')]) {
 bat """
 REM 1. 登錄 Docker Hub
 echo %DOCKER_PASS% | docker login -u %DOCKER_USER% --password-stdin
 
 REM 2. 禁用 BuildKit,防止 Windows 上報 insufficient_scope
 setx DOCKER_BUILDKIT 0
 
 REM 3. 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 REM 4. 生成Dockerfile
 mlflow models generate-dockerfile -m models:/${params.MODEL_NAME}/${MODEL_VERSION} -d ${ROOT_PATH} --enable-mlserver
 
 REM 5. 在 Dockerfile 中第一條 FROM 后插入 pip 國內源配置
 REM 定義 Dockerfile 路徑
 set DOCKERFILE=${ROOT_PATH}\\Dockerfile
 set TMPFILE=%DOCKERFILE%.tmp
 
 REM 清空臨時文件
 if exist %TMPFILE% del /f /q %TMPFILE%
 
 REM 遍歷 Dockerfile 行
 for /f "usebackq delims=" %%A in (%DOCKERFILE%) do (
 echo %%A>>%TMPFILE%
 REM 匹配 FROM python:3.10.18-slim
 echo %%A | findstr /r "^FROM python:3.10.18-slim" >nul
 if not errorlevel 1 (
 echo RUN pip install --upgrade pip ^&^& pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple>>%TMPFILE%
 )
 )
 
 REM 用臨時文件替換原 Dockerfile
 move /y %TMPFILE% %DOCKERFILE%
 
 REM 6. 構建你的 MLflow + MLServer 鏡像
 cd /d "${ROOT_PATH}"
 docker build -t ${params.MODEL_NAME}:v${MODEL_VERSION} .
 """
 }
 }
 }
 
 stage('部署到Docker容器') {
 steps {
 echo "開始部署容器..."
 bat """
 @echo off
 REM 檢查容器是否存在
 docker inspect %CONTAINER_NAME% >nul 2>&1
 if %errorlevel% equ 0 (
 echo 容器 %CONTAINER_NAME% 存在,正在停止并刪除...
 docker stop %CONTAINER_NAME%
 docker rm %CONTAINER_NAME%
 ) else (
 echo 容器 %CONTAINER_NAME% 不存在,直接啟動新容器...
 )
 
 REM 用新鏡像啟動容器(后臺運行)
 echo 啟動新容器 ${CONTAINER_NAME}...
 docker run -d --name ${CONTAINER_NAME} -p 8083:8080 ${params.MODEL_NAME}:v${MODEL_VERSION}
 """
 }
 }
 
 stage('測試容器接口/invocations') {
 steps {
 bat """
 echo "調用接口"
 REM 3. 激活 Conda 環境
 call "${CONDA_ACTIVATE}" ${CONDA_ENV}
 
 cd /d "${ROOT_PATH}"
 python demo_api.py
 """
 }
 }
 }
 }

接下來我們來看看詳細內容:

environment腳本

我們對一些主要參數進行講解如下:

MLflow 相關配置變量MLFLOW_ARTIFACT_URI,該路徑需與 MLflow Server 啟動命令中--artifacts-destination參數指定的路徑完全一致(如之前啟動命令中--artifacts-destination file:///d:/mlflow/mlartifacts,則此處需同步修改為對應路徑),用于定義 MLflow 存儲模型 Artifacts(如模型權重、評估報告)的默認位置,同時需提前確保該目錄已手動創建,避免后續模型注冊、評估時因路徑不存在導致失敗。

工具與數據路徑類變量是配置的核心,涵蓋 LLaMA-Factory、數據集、模型存儲等關鍵位置。其中LLAMA_FACTORY_PATH = 'd:\\mlflow\\LLaMA-Factory'直接指向 LLaMA-Factory 框架的安裝目錄,后續微調環節需切換至該目錄執行訓練命令,因此路徑需與實際安裝位置完全匹配。

TRAIN_OUTPUT_PATH = 'saves\\Qwen2-0.5B\\lora'定義了微調后模型 checkpoint 的存儲路徑,其實際完整路徑為LLAMA_FACTORY_PATH與該變量的拼接,該目錄會在微調過程中自動創建,用于存放 LoRA 微調后的權重文件。需特別注意的是,路徑中的 “Qwen2-0.5B” 對應本次實戰使用的基座模型名稱,需同步修改該字段,避免不同模型的 checkpoint 混雜存儲,影響后續模型合并。MERGED_PATH = 'd:\\mlflow\\merge'則是模型合并后的存儲路徑,僅需提前確保該目錄存在,即可在 “合并 Lora 和預訓練模型” 階段接收合并后的完整模型文件。

ROOT_PATH = 'd:\\mlflow'作為運行環境數據根目錄,統一管理全流程所需的自定義腳本與評估數據,目前該目錄下存放四類關鍵文件:合并 Lora 與基礎模型的merge_lora_model.py、注冊模型到 MLflow 的register_model.py、模型評估腳本evaluate.py,以及評估數據集myTrain.json(對應變量EVAL_DATA = 'd:\\mlflow\\myTrain.json'),這種集中存儲方式便于后續維護與路徑調用。

最后是 Conda 環境與 Docker 相關變量,CONDA_ACTIVATE = "c:\\ProgramData\\anaconda3\\condabin\\activate.bat"指向 Conda 激活腳本的路徑,需與實際安裝的 Conda 路徑匹配,后續各環節通過調用該腳本激活指定 Conda 環境;CONDA_ENV = "mlflow"則是本次實戰使用的 Conda 環境名稱,需與安裝階段創建的環境名稱完全一致,確保微調、評估等依賴包能正常加載。CONTAINER_NAME = "llm_test"定義了模型部署階段的 Docker 容器名稱,后續啟動容器、停止容器時均通過該名稱識別目標容器,若需同時部署多個模型,可通過修改該變量區分不同容器。

Stages 腳本

按照九個不同的步驟,總結如下:

1. 驗證參數

該階段作為全流程的入口校驗環節,負責確保所有必要輸入符合規范。首先檢查MLFLOW_TRACKING_URI參數是否為空,若為空則報錯終止流程,確保 MLflow 服務地址有效;同時驗證是否存在上傳的微調數據集,未上傳則直接報錯。對上傳的文件,先檢查格式是否為.json,不符合則提示僅支持 JSON 格式;通過unstash恢復文件后,讀取內容并解析為 JSON 對象,驗證其根元素是否為數組,且每個子項是否為包含instruction、input、output字段的對象,確保數據結構滿足微調要求。驗證通過后,將文件復制到DATASET_URI指定路徑,為后續微調提供標準化數據輸入。

2. 微調模型

此階段是模型定制的核心環節,通過 LLaMA-Factory 框架執行微調操作。流程上先激活CONDA_ENV指定的 Conda 環境,切換到 LLaMA-Factory 安裝目錄,再執行llamafactory-cli train命令啟動微調。命令中明確了關鍵參數:采用監督微調模式(stage sft),使用 LoRA 參數高效微調技術(finetuning_type lora),數據集為dataset(與dataset_info.json配置對應),同時設置了學習率(5e-05)、訓練輪次(20 輪)、批處理大小(2)、輸出路徑(TRAIN_OUTPUT_PATH)等訓練參數。最終將微調產生的 LoRA 權重保存到指定目錄,為模型合并提供基礎。

3. 合并模型

該階段用于整合微調得到的 LoRA 權重與原始基座模型。通過激活 Conda 環境,調用merge_lora_model.py腳本,傳入三個關鍵參數:基座模型路徑(params.MODEL_NAME_OR_PATH)、LoRA 權重路徑(LLAMA_FACTORY_PATH與TRAIN_OUTPUT_PATH的拼接結果)、輸出目錄(MERGED_PATH),將兩者合并為完整的模型文件并保存,為后續格式轉換和部署提供統一的模型載體。

4. 轉換模型

此階段實現模型格式的轉換以提升硬件兼容性。激活 Conda 環境后,切換到 llama.cpp 目錄,先檢查convert輸出目錄是否存在,不存在則自動創建;隨后通過convert_hf_to_gguf.py腳本將MERGED_PATH中的合并模型轉換為 GGUF 格式,輸出至ROOT_PATH\\convert\\merge-auto.gguf。GGUF 格式的通用性使得模型可在更多硬件環境(如 CPU、邊緣設備)中部署,拓展了模型的應用場景。

5. 注冊模型

該階段將合并后的模型納入 MLflow 的版本管理體系。激活 Conda 環境后,執行register_model.py腳本,傳入模型名稱(params.MODEL_NAME)、模型目錄(MERGED_PATH)、實驗名稱(params.MODEL_NAME)及 MLflow 服務地址(params.MLFLOW_TRACKING_URI),完成模型注冊并將過程日志輸出到文件。通過正則表達式從日志中提取模型版本號,存入MODEL_VERSION環境變量,為后續鏡像生成和部署提供唯一版本標識。

6. 評估模型

此階段用于驗證合并后模型的性能指標。激活 Conda 環境后,切換到ROOT_PATH目錄,執行evaluate.py腳本,傳入模型名稱(params.MODEL_NAME)、評估數據集路徑(EVAL_DATA)、實驗名稱(params.MODEL_NAME)及 MLflow 服務地址,計算模型評估指標并將結果記錄到 MLflow,為模型質量提供量化依據,確保其滿足預期效果。

7. 生成鏡像

該階段為模型創建容器化部署的鏡像。通過 Jenkins 憑據管理獲取 Docker Hub 賬號密碼并完成登錄,禁用 BuildKit 以避免 Windows 環境下的兼容性問題;激活 Conda 環境后,使用mlflow models generate-dockerfile生成鏡像配置文件,同時修改 Dockerfile 插入 PyPI 國內源以加速依賴安裝;最終基于修改后的 Dockerfile 構建帶有版本標識(params.MODEL_NAME:vMODEL_VERSION)的鏡像,為模型部署提供標準化載體。

8. 部署容器

此階段將生成的鏡像部署為可運行的容器服務。流程上先檢查CONTAINER_NAME指定的容器是否存在,若存在則停止并刪除舊容器;再基于新鏡像啟動后臺運行的容器,將主機 8083 端口映射到容器 8080 端口,使模型服務可通過主機端口對外提供訪問,完成模型從鏡像到實際服務的轉化。

9. 測試模型

作為全流程的收尾環節,該階段驗證部署的容器服務是否正常可用。激活 Conda 環境后,切換到ROOT_PATH目錄,執行demo_api.py腳本調用容器的/invocations接口,測試模型服務的響應情況,確保接口正常通信且模型輸出符合預期,最終完成整個 LLMOps 流程的閉環驗證。

另外需要手動修改 LLaMAFactory 目錄下的dataset 文件如下:

"dataset": {
 "file_name": "custom.json"
 },

因為在這個文件下對應的都是可以微調的文件的名字,我們在腳本中會指定使用 cusotm.json。這里會將用戶上傳的文件 copy 到cusotm.json 中進行微調處理。

測試 LLMOps 流程

了解了整體 Pipeline 腳本之后,我們開始 LLMOps 流程的測試。首先下載大模型,如下:

conda activate mlflow
 pip install modelscope
 # 加--local_dir可指定模型下載保存的目錄
 # 例如C:\\models\\qwen\\qwen2-0.5b-instruct
 modelscope download --model qwen/qwen2-0.5b-instruct --local_dir d:\\mlflow\\Qwen2-0.5b

看到類似下面的截圖表示正在下載。

準備好模型之后,通過下圖操作,啟動 Pipeline 工作流。

填入參數包含:微調文件,MLflow 地址,基座模型存放目錄,MLflow 中注冊模型的名字。

這里我們會上傳 myTrain.json 文件作為微調的數據集文件, 其內容大致如下,由于篇幅關系我們就不粘貼所有的文本內容了。大約使用了這樣的數據 200 余條進行微調。

[
 {
 "instruction": "hi",
 "input": "",
 "output": "Hello! I am 微調小助手, an AI assistant developed by 小明. How can I assist you today?"
 },
 ]

此時,Pipeline 就開始工作了,由于整個過程比較漫長,特別是微調、評估、部署會花費比較多的時間,可以通過下面方法查看執行進度。選擇執行的 Pipeline,然后點擊“Pipeline Overview”。

如下圖所示,在最上方會顯示執行的步驟。如果中途出現問題,點擊步驟可以查看運行結果,以及錯誤原因。

這里設置幾個檢查點,大家可以自行查看。比如LLaMAFactory 微調成功后會在配置的環境變量(TRAIN_OUTPUT_PATH)對應的目錄下生成微調后模型。這里的模型都是 checkpoint,需要和之前下載的基座模型進行合并,然后才能部署。

合并之后的模型,可以通過MERGED_PATH 變量配置的目錄查看。

接著就是轉化為 gguf 的模型,可以在對應的目錄查到。

上述這些模型目錄的查證不是必須的,這里是讓大家知道整個過程中如何追蹤文件生成,方便大家了解全過程,理解執行邏輯。

在注冊模型階段會把合并之后的模型在MLflow中注冊,這里需要注意模型版本。

同時通過MLflow WebUI可以查看注冊的模型信息。

按照下圖的操作選擇注冊模型之后,可以看到模型的評估結果。

查看模型評估指標。

在完成模型評估之后,可以通過Docker Desktop查看生成的鏡像,這里一眼就可以看到模型的名稱,要注意的是模型版本會和注冊到MLflow 中的版本一致。圖中 “Tag”下面就是模型的版本。

有了 Docker 鏡像之后,就可以根據該鏡像部署到Docker容器中,部署完成后會運行一個新的容器llm_test,這個名字在環境變量(CONTAINER_NAME)中配置過。

最后我們會通過模型的 API 接口調用模型,從而測試模型是否可以用,如下圖所示,在運行成功后會在Jenkins控制臺輸出調用結果。

至此,整個 LLMOps 過程完結。

作者介紹

崔皓,51CTO社區編輯,資深架構師,擁有18年的軟件開發和架構經驗,10年分布式架構經驗。

責任編輯:姜華 來源: 51CTO
相關推薦

2024-12-23 00:27:40

2023-04-07 15:04:48

新華三

2025-07-11 01:44:00

架構軟件開發

2025-01-16 11:45:26

2024-06-13 09:20:26

2013-08-27 10:17:06

SDN網絡軟件定義網絡

2025-07-03 03:20:00

2024-08-19 10:01:55

2024-11-01 12:39:04

2022-01-04 14:37:32

聯想百應商務辦公應用服務

2016-05-12 10:33:32

2025-05-14 03:00:00

Go語言控制

2025-03-14 08:29:49

2020-08-10 15:05:02

機器學習人工智能計算機

2025-05-28 08:35:00

Nacos服務訂閱流程開發

2021-06-17 10:28:42

谷歌開源轉譯器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 娄烦县| 安徽省| 大竹县| 徐汇区| 涿鹿县| 洛浦县| 临汾市| 同江市| 霍山县| 阿荣旗| 铁岭市| 澄城县| 固原市| 洪湖市| 济阳县| 贵南县| 嘉兴市| 闸北区| 揭西县| 轮台县| 土默特左旗| 齐河县| 兴义市| 顺平县| 佛坪县| 横峰县| 香港| 盱眙县| 白玉县| 唐海县| 阜平县| 盘山县| 奈曼旗| 汉沽区| 金塔县| 屏南县| 酉阳| 虹口区| 余庆县| 滁州市| 广东省|