使用 Unsloth 在 30 分钟内构建自定义自动完成模型(社区帖子)

这是 Sophia Parafina 在 Continue 博客上的客座文章,Sophia Parafina 是一位开发者倡导者,曾就职于 Pulumi、Anaconda 和 Docker。
Continue 是一个开源的 AI 代码助手。它是一个复合 AI 系统,结合使用一套模型(聊天、自动完成、嵌入等)和其他组件。其主要优势之一在于它会记录开发数据,这对于微调 LLM 以产生更好的开发者建议非常有益。
微调过去需要数小时的 GPU 时间和专业知识。然而,Unsloth 提供了用于在免费 Google Colab 实例上进行微调的 Jupyter Notebook。在这篇文章中,我将展示如何使用 Unsloth 微调模型,以便您可以用基于您的开发数据微调的模型替换通用的开源自动完成模型。
使用 Unsloth 进行微调
1. 将您的开发数据复制到工作目录
Linux/macOS
mkdir training_data && cp training_data
cp ~/.continue/dev_data/autocomplete.jsonl .
Windows
md training_data && cp training_data
copy C:\Users\username\.continue\dev_data\autocomplete.jsonl .
2. 格式化开发数据
Unsloth Notebook 使用 alpaca 数据集格式
- instruction:描述模型应执行的任务。这 5.2 万条 instruction 各不相同。
- input:任务的可选上下文或输入。例如,当 instruction 是“总结以下文章”时,input 就是该文章。大约 40% 的示例包含 input
- output:text-davinci-003 生成的针对 instruction 的答案。
Unsloth 仅使用开发数据中的 prompt 和 completion 字段,例如
{
"prompt": "[SUFFIX]\n </div>\n );\n}\n[PREFIX]import { SharedHeader } from \"@/components/shared-header\";\n\nexport function UserSettingsPage() {\n return (\n <div>\n <SharedHeader />\n <h1>User Settings</h1>\n ",
"completion": "<p>This is the user settings page.</p>",
}
我们将使用 dlt 来格式化训练数据并将其保存到 Hugging Face datasets
import dlt
import json
from huggingface_hub import HfApi
@dlt.resource(table_name="autocompletions")
def resource():
with open("autocomplete.jsonl", "r") as file:
for line in file:
full_data = json.loads(line)
if full_data["accepted"]:
yield {
"instruction": full_data["prompt"],
"input": "",
"output": full_data["completion"],
}
@dlt.destination(batch_size=0, loader_file_format="parquet")
def hf_destination(items, table):
api = HfApi()
api.upload_file(
path_or_fileobj=items,
path_in_repo=items.split("/")[-1],
repo_id="<username>/continue-training-data",
repo_type="dataset",
)
pipeline = dlt.pipeline(pipeline_name="continue_data", destination=hf_destination)
load_info = pipeline.run(resource())
print(load_info)
3. 微调模型
我们将使用一个 Unsloth Notebook 在 Google Colab 中微调 Qwen2.5-Coder-7B
。Notebook 中没有列出该模型,但 Unsloth 在 Hugging Face 上提供了 200 多个模型。在 Notebook 的第二个单元格中设置要使用的模型
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/Qwen2.5-Coder-7B-bnb-4bit",
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
# token = "hf_...", # use one if using gated models like meta-llama/Llama-2-7b-hf
)
在 Data Prep 单元格中,指定上传到 Hugging Face datasets 的训练数据
from datasets import load_dataset
dataset = load_dataset("<username>/continue-training-data", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
现在我们已经选择了模型并加载了开发数据,我们可以使用 Hugging Face 的 Supervised Fine-tuning Trainer (SFT) 来微调它。
4. 保存模型
Notebook 提供了几种保存模型的选项,包括仅保存 LORA 模型、float16 格式以及 Ollama、LM Studio 和 Llamafile 等推理引擎支持的 GGUF 格式。
在 GGUF / llama.cpp Conversion 单元格中,将模型保存到 Hugging Face,格式为 q4_k_m 量化模型,这是一种在大小和精度之间取得平衡的模型。提供您的仓库、模型名称和 Hugging Face token 来保存模型
# Save to q4_k_m GGUF
if False: model.save_pretrained_gguf("model", tokenizer, quantization_method = "q4_k_m")
if False: model.push_to_hub_gguf("<username>/qwen2.5-coder-continue", tokenizer, quantization_method = "q4_k_m", token = "hf-xxxxxx")
5. 要运行 Notebook,选择 Runtime > Run All
6. 使用 Ollama 进行推理
从 Hugging Face 下载模型。我们将使用 Ollama 运行训练好的模型,但首先必须导入模型。创建一个名为 qwen2.5-coder-continue
的 Ollama Modelfile 并添加以下内容
FROM /path/to/qwen2.5-coder-continue
使用 ollama create
命令构建模型。使用 ollama list
查看模型并使用该模型启动 Ollama
ollama create qwen2.5-coder-continue
ollama list
ollama start qwen2.5-coder-continue
7. 配置 Continue
最后一步是使用模型配置 Continue。编辑 config.json
文件并用模型名称更新 tabAutocompleteModel
"tabAutocompleteModel": {
"title": "Qwen2.5 Coder Continue",
"provider": "ollama",
"model": "qwen2.5-coder-continue"
},
总结
自动完成模型在各种数据集上进行训练。这些数据集包括来自开源项目的代码、其他开发者编写的代码以及合成生成的代码。使用您的开发数据微调模型可以提高建议的准确性,因为它是基于您实际编写的内容。要尝试 Continue,请在 VS Code 或 JetBrains 中安装扩展程序。