硬件条件:
jetson agx orin 64G dev kit,PC
256G 固态硬盘
数据线
目的:在云端微调模型,在jetson上进行合并和量化,每次更新模型只需要同步微调权重,减少网络压力(12G ->200M)。
Jetson系统配置
step1:
更新系统至最新jpack6,使用PC串口连jetson,更新系统,再安装CUDA和cuda runtime等工具组件。
注意,docker不要安装,否则会出现网络问题导致失败。
step2:安装jetson版的docker,jetson-container。
https://github.com/dusty-nv/jetson-containers
jetson container说明:需要熟悉docker指令,如文件夹映射,端口映射。
其使用格式和docker类似,但又包含nvidia的一些特性(直接用docker 启动可能失败)
step3:挂载数据盘(自备固态硬盘);更改docker镜像安装位置;安装conda
注意:jetson系统盘仅64G,需要在挂载的硬盘里安装额外软件。
step4:拉取镜像:Ollama
选择1: 需要VPN,并且jetson不支持wireguard代理、proxy代理docker需要在docker deamon里配置)。最好能在路由端加速。然后直接按照教程可拉取镜像。本次用到的镜像有Ollama。但官方推荐使用MLC或NanoLLM(速度更快)。
选择2: 找到相应的镜像编号,使用外网电脑拉取镜像后手动安装。
注意:尽量不要在官方给出的demo外测试,并且官方的docker镜像不是最新源码编译的版本(无说明和教程),很可能会导致模型产生一些兼容性问题。
微调:llama factory(云端)
模型选型为Qwen-14B
使用人工数据生成模板数据,并通过GPT4续写,生成更多的模板数据
建立关键词库,使用代码随机替换模板中的关键词,生成数据集。
数据集规模为4k条指令对话
使用LLAMA Factory进行Lora微调;
选取int8量化的模型进行QLora微调(未完全测试)
注:需要进一步测试和修改微调方案,测试修改词表方案,全参微调
量化:llama cpp(jetson)
使用llama cpp进行量化
- 下载并编译llama cpp
- 使用llamacpp中的工具merge模型,并转化为gguf格式
- 对gguf模型进行量化,量化方式为Q8或Q5_0
注:Lora量化产生的精度损失问题比较严重,Lora的效果几乎消失,需要在system提示词中增加两段例子,才能得到稳定的输出。
也有其他可行的方案,如:
不合并模型,但不能直接用Ollama搭建服务,docker镜像貌似会挂掉,且llamacpp的服务代码需要改写,原生serve速度很慢;
合并和量化在云端进行,每次更新下载全部权重,如LMdeploy jetson的非官方教程(未测试);
使用MLC量化和推理(需要增加Qwen推理模板,但官方docker镜像没有教程,并且使用了被废弃的api,建议从头编译,测试通过)
本流程需要15分钟左右的运/行时间,最后得到17.2 tokens/s的模型服务
推理:Ollama
Ollama使用docker镜像搭建,按照官方给出的导入自定义模型的方法,进行推理和api调用。