LLaMA Factory是开源一站式大模型微调训练框架,北航团队开发GitHub 高星项目,主打低门槛、全兼容、轻量化微调,普通人用消费级显卡就能定制专属大模型,统一封装百余种主流大模型的训练、微调、推理流程,不用手写复杂训练脚本,提供网页可视化 UI(LlamaBoard)+ 命令行两种操作方式,小白零代码即可完成微调,专业开发者支持批量实验与集群训练LLaMA Factory。
Llama factory官方支持命令行一键安装,这里使用k8s演示是为了契合深信服AICP平台环境,AICP中的SKE平台支持使用k8s标准的yaml文件部署工作负载,在测试项目需要训练模型的场景下,部署该平台可以作为对AICP模型训练能力的一个补充,同时也不会对AICP宿主机造成任何影响。文档演示了在k8s环境部署llama factory,并正常调用宿主机显卡进行模型训练的过程。
2.1软硬件资源物理主机:6C32G | RTX3060 12G
软件版本:Ubuntu24.04 | k8s1.36.0 | NVIDIA-SMI595.71.05 | CUDA Version: 13.2
2.2预置条件(1)针对全新搭建的k8s环境,宿主机需要先安装好NVIDIA官方驱动,使用nvidia-smi命令就可以看到驱动版本和CUDA版本;
(2)安装nvidia-container-toolkit 工具包,给K8s的containerd容器引擎注入 NVIDIA GPU运行时配置;
(3)使用runtimeclass-nvidia.yaml配置nvidia运行时,使用nvidia-device-plugin.yaml声明显卡资源,样例配置文件如下:
#-------------------nvidia-device-plugin-------------------
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-device-plugin-daemonset
namespace: kube-system
spec:
selector:
matchLabels:
name: nvidia-device-plugin-ds
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
name: nvidia-device-plugin-ds
spec:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
priorityClassName: "system-node-critical"
containers:
- image: nvcr.io/nvidia/k8s-device-plugin:v0.18.0
name: nvidia-device-plugin-ctr
env: []
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
volumeMounts:
- name: kubelet-device-plugins-dir
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: kubelet-device-plugins-dir
hostPath:
path: /var/lib/kubelet/device-plugins
type: Directory
#-------------------runtimeclass-nvidia-------------------
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia
(4)llama factory镜像有15g,在线拉取成功率不高,可以提前下载后进行导入
三、部署过程3.1数据持久化为了避免由于pod启停或重建造成模型文件与训练数据丢失,这里使用本地存储创建pvc,后续挂载给pod使用;如果是在ske中,可以安装CSI插件后对接NFS\aSAN\EDS以提供持久卷功能。
创建本地目录,用于保存模型文件以及训练数据
mkdir -p /data/models /data/app/saves
创建SC
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Retain
创建PV,注意这里面values:["需要替换为实际节点NAME"],可以用kubectlget nodes查看
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-model-50g
spec:
capacity:
storage: 50Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/models
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: ["clear-system-product-name"]
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-save-50g
spec:
capacity:
storage: 50Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/app/saves
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: ["clear-system-product-name"]
创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: llamafactory-model-pvc
spec:
storageClassName: local-storage
accessModes:
-ReadWriteOnce
resources:
requests:
storage: 50Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: llamafactory-save-pvc
spec:
storageClassName: local-storage
accessModes:
-ReadWriteOnce
resources:
requests:
storage: 50Gi
依次生效配置文件
kubectl apply -f local-storage-class.yaml
kubectl apply -f local-storage-pv.yaml
kubectl apply -f local-storage-pvc.yaml
3.2启动服务将提前下载好的llama factory镜像文件上传到服务器本地,使用命令进行导入
ctr -n k8s.io image import llama_factory_0.9.6.tar,使用nodeport方式将镜像内7860端口映射至节点的30860端口,用于访问web界面。
创建pod并发布web端口
# -------------------------- LlamaFactory Deployment----------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: llamafactory-web-12g
spec:
replicas: 1
selector:
matchLabels:
app: llamafactory-12g
template:
metadata:
labels:
app: llamafactory-12g
spec:
hostIPC: true
runtimeClassName: nvidia
volumes:
- name: model-storage
persistentVolumeClaim:
claimName:llamafactory-model-pvc
- name: save-storage
persistentVolumeClaim:
claimName:llamafactory-save-pvc
containers:
- name: llamafactory
image:hiyouga/llamafactory:latest
imagePullPolicy:IfNotPresent
command:["sh", "-c"]
args:
- |
pip installbitsandbytes>=0.37.0
llamafactory-cliwebui
ports:
- containerPort: 7860
volumeMounts:
- name:model-storage
mountPath: /models
- name: save-storage
mountPath:/app/saves
resources:
limits:
nvidia.com/gpu: 1
memory:"10Gi"
cpu: "6"
requests:
nvidia.com/gpu: 1
memory:"8Gi"
cpu: "3"
stdin: true
tty: true
---
# -------------------------- 服务暴露--------------------------
apiVersion: v1
kind: Service
metadata:
name: llamafactory-svc-12g
spec:
selector:
app: llamafactory-12g
type: NodePort
ports:
- port: 7860
targetPort: 7860
nodePort: 30860
生效配置文件
kubectl apply -f llamafactory.yaml
3.3检查运行状态
使用命令查看PV PVC生效情况,正常看到Bound状态即可
kubectl get pv,pvc
使用命令查看pod状态,正常看到Running状态即可
kubectl get pods
在浏览器打开http://[节点IP]:30860,可以正常打开页面即可
四、平台使用 4.1模型获取与上传
在首页点击【模型名称】可以搜索需要的模型,国内模型下载源选择【modelscope】;使用这种方式自动下载,模型保存目录是pod内:/root/.cache/modelscope/hub/models。
4.2模型对话与训练
在准备好模型文件后,可以先加载模型进行对话测试,用于判断模型文件是否可以正常识别,显卡资源是否可以正常调用;页面上选择【Chat】菜单,点击【加载模型】。
加载完成后在页面下方发送对话内容后模型可以正常进行回复,同时可以看到显卡显存已经有了占用,那下一步就可以进行训练了,训练前记得点击【卸载模型】。
训练需要在页面上选择【Trian】菜单,默认使用SFT的训练方式,训练所需数据集需要用户提供,平台内置的样例数据可以验证训练过程是否正常;页面上其余配置选项都需要依据客户实际需求进行调整。
在配置完训练参数后在页面下方点击开始。
开始训练后,页面会开始刷新训练日志,设备显存占用也有明显提升。
也可以在宿主机使用nvidia-smi查看显卡使用情况。
完成当前的训练任务后,在宿主机目录下可以查看训练日志与检查点保存情况:/data/app/saves,页面【检查点路径】处则可以选取对应检查点,以便进行后续的训练操作。
五、小结1、本文档主要是为了记录自己完成实践的过程,顺便希望给大家在解决类似需求时提供一些启发;
2、文档中如果发现任何问题,请及时联系,我会加以修正;
3、后续会在AICP测试环境跑通以上流程,敬请期待。