如果你也想使用 Ollama 友好的界面微调 大型语言模型 (LLM),并借助 Google Cloud Platform 上的 Vertex AI 实现模型的可扩展性,那么你并不孤单。将 Ollama 的便捷性和 GCP 的托管基础设施相结合,似乎是机器学习领域的理想搭配。
然而,一旦深入实际操作,问题就会浮出水面。尤其是在将 Ollama 这种本地优先的工具与 Vertex AI 这种云原生平台相结合时,微调 过程并非一帆风顺。本文将深入剖析在使用 Vertex AI 微调 Ollama 模型时,你将面临的实际局限性,以及应对这些局限性的可行方案。
Ollama 微调:支持哪些模型?
Ollama 对 llama2、mistral 和 codellama 等模型提供有限的 微调 支持。它遵循极简的 CLI 命令行界面方法:
ollama run llama2
ollama create mymodel --modelfile ./Modelfile
你可以通过提示词风格的文本传递训练数据,但 Ollama 并非为跨分布式基础设施的大规模 微调 而设计。它的设计理念就是轻量级。例如,你可以通过一段对话形式的文本数据,让 Ollama 针对特定领域进行微调,使其更擅长回答相关问题。 然而,当训练数据增长到 GB 级别时,Ollama 的处理能力就会捉襟见肘。
Vertex AI 则通过自定义容器、AutoML 或微调 Model Garden 中的预训练模型来支持模型训练和 微调。但它期望结构化的数据集,例如 TFRecord/CSV/JSONL 格式,以及特定的模型架构钩子。例如,Vertex AI 能够处理大规模的金融交易数据,利用这些数据微调一个金融领域的 LLM,提高其在风险评估和欺诈检测方面的能力。
当你尝试在 Vertex AI 上微调 Ollama 时会发生什么?
1. 缺乏多节点训练支持
Ollama 不支持开箱即用的分布式训练。这在 Vertex AI 上造成了瓶颈,因为 TPU/GPU 集群就是为可扩展的训练作业而设计的。设想一下,你尝试为 Vertex AI 构建一个自定义容器,该容器包装了 Ollama 的 CLI:
FROM ollama/ollama:latest
COPY train.txt /app/train.txt
RUN ollama create mymodel --modelfile /app/Modelfile
你会遇到两个问题:
- Ollama 运行时未针对 GCP 硬件加速器进行优化。这意味着即使你使用了强大的 TPU 或 GPU,Ollama 也无法充分利用这些资源,导致训练速度缓慢。
- 无法跨多个节点对训练集进行分片。在 Vertex AI 的分布式训练环境中,数据分片是提升训练效率的关键。Ollama 无法实现数据分片,导致训练过程只能在一个节点上进行,无法充分发挥 Vertex AI 的集群优势。
Vertex AI 的 CustomJob 资源希望你显式地处理训练循环(通常使用 PyTorch 或 TensorFlow 等框架)。使用 Ollama,你将失去对内部原理的控制。例如,如果你想使用 100GB 的图像数据训练一个图像识别模型,Vertex AI 可以将数据分发到多个节点上,每个节点负责处理一部分数据,从而大大缩短训练时间。而 Ollama 无法进行这样的数据分发,导致训练时间非常漫长。
2. 数据摄取无法扩展
Ollama 期望以扁平的文本提示-响应格式提供微调数据。当处理存储在 Cloud Storage 或 BigQuery 中的数据集时,这会变得效率低下。例如,Ollama 期望的数据格式如下:
### Instruction:
写一个反转字符串的函数。
### Response:
def reverse_string(s):
return s[::-1]
对于更大的数据集(1 万条以上),将这些数据加载到 Ollama 的内存中是无法扩展的。例如,如果你要使用 10 万条客户服务对话数据来微调一个客服机器人,将这些数据加载到 Ollama 的内存中可能会导致内存溢出,训练过程无法进行。
相比之下,Vertex AI 期望的格式如下:
{
"inputs": "写一个反转字符串的函数。",
"outputs": "def reverse_string(s):\n return s[::-1]"
}
你需要编写一个数据转换层,将结构化数据转换为 Ollama 的提示格式,而 CLI 工作流程本身并不原生支持这一点。例如,你需要编写一个 Python 脚本,从 BigQuery 中读取数据,将其转换为 Ollama 期望的格式,然后再将其输入到 Ollama 中进行微调。这个过程增加了额外的开发工作量和复杂性。
3. 不原生支持 Vertex AI Model Registry
使用 Vertex AI 微调模型通常以干净的交接结束:
- 在 Model Registry 中注册模型。
- 将其部署到端点。
- 使用 Vertex Model Monitoring 对其进行监控。
而使用 Ollama 呢?情况并非如此。微调后的模型存储在本地或导出为 .bin 文件。你需要构建自己的桥梁:
ollama export mymodel > model.bin
然后:
- 将 model.bin 存储在 Cloud Storage 中。
- 使用自定义预测例程加载它。
- 通过 Vertex AI 上的自定义容器进行部署。
这需要大量的额外工作,才能实现 Vertex AI 通常自动处理的功能。例如,你需要编写一个 Docker 镜像,其中包含加载 model.bin 文件的代码,并将其部署到 Vertex AI 的自定义容器中。此外,你还需要配置 Vertex Model Monitoring,以监控模型的性能。这些步骤都增加了部署和维护的复杂性。
真正有帮助的变通方法
如果你铁了心要在云环境中使用 Ollama 进行 微调,请考虑以下混合方法:
- 使用 Ollama 进行轻量级预调:在本地/开发环境中,使用 Ollama 运行轻量级的少样本微调会话。测试你的数据集,验证你的提示格式,并在迁移到生产环境之前验证模型行为。例如,你可以使用 Ollama 在本地快速测试不同的提示词,看看哪个提示词能更好地引导模型生成期望的输出。
- 将训练后的模型转换为 HuggingFace 兼容格式:如果可能,将模型导出为可以由 transformers 加载并在 Vertex AI 上部署的格式:
ollama export mymodel > model.bin
然后将其与包装 HuggingFace 模型加载器的自定义服务容器一起使用。例如,你可以使用 HuggingFace 的 transformers
库加载 model.bin 文件,并将其部署到 Vertex AI 的自定义容器中。这样可以更方便地利用 HuggingFace 生态系统中的工具和资源。
-
将微调逻辑包装在自定义容器中:使用 Docker 镜像来封装:
- 数据加载
- 提示格式化
- Ollama 执行
- 模型导出
示例 Dockerfile:
FROM ubuntu:20.04
RUN apt update && apt install -y curl unzip
RUN curl -fsSL https://ollama.com/install.sh | sh
COPY train.txt /app/train.txt
COPY Modelfile /app/Modelfile
WORKDIR /app
RUN ollama create mymodel --modelfile Modelfile
CMD ["ollama", "run", "mymodel"]
使用 Vertex AI 的 CustomJob 与单个工作池进行部署:
from google.cloud import aiplatform
aiplatform.CustomJob(
display_name="ollama-fine-tune",
worker_pool_specs=[{
"machine_spec": {"machine_type": "n1-standard-4"},
"replica_count": 1,
"container_spec": {"image_uri": "gcr.io/my-project/ollama-fine-tune"},
}]).run()
例如,你可以创建一个包含 Ollama 和所有依赖项的 Docker 镜像,并将数据加载、提示格式化和模型导出等逻辑都封装在这个镜像中。然后,你可以使用 Vertex AI 的 CustomJob 来运行这个镜像,从而实现 Ollama 模型的微调。
最后的思考
Ollama 非常适合开发者端的实验,但它尚未准备好用于生产环境的 微调。Vertex AI 正是为此而构建的,但它希望对模型内部原理具有完全的透明性。
直接尝试在 Vertex AI 上微调 Ollama 模型就像试图将方钉子插入圆孔。
你可以使用自定义包装器、转换脚本和容器来桥接两者,但不要期望原生集成或完全的可观察性。
使用 Ollama 进行早期阶段的 微调 和模型探索。当需要扩展或进行多用户操作时,可以选择:
- 将你的模型转换为 HuggingFace 格式,或
- 切换到 Vertex AI 的原生微调流程,使用 Model Garden 或 AutoML。
总之,Ollama 和 Vertex AI 各有优势,但在微调大型语言模型时,需要根据实际情况选择合适的工具和方法。 理解 Ollama 的局限性,并采取相应的变通方法,才能有效地利用这两个平台的优势,最终实现成功的模型微调。 例如,如果你的目标是快速原型验证和实验,Ollama 是一个不错的选择。 但如果你的目标是构建可扩展的、生产级别的 LLM 应用,则 Vertex AI 可能更适合你。 结合使用 Ollama 和 Vertex AI,可以在开发周期的不同阶段利用它们各自的优势,最终构建出高质量的 LLM 应用。 关键在于了解每个工具的优势和局限性,并根据实际需求做出明智的选择。 此外,随着大模型技术的不断发展,未来的工具和平台可能会提供更 seamless 的集成和更强大的功能,从而简化 LLM 的开发和部署过程。