Contents
简介:Ollama与SafeTensors的兼容性挑战
Ollama是一个强大的本地化LLM运行环境,极大地简化了模型部署。然而,Ollama主要依赖于GGUF (GPT-GEnerated Unified Format) 格式的模型,该格式是llama.cpp生态系统的核心,专为高效的CPU和GPU混合推理而设计。
SafeTensors是Hugging Face生态系统中流行的模型权重序列化格式,它解决了传统PyTorch Pickle文件潜在的安全问题,并提供更快的加载速度。虽然许多大模型(如Llama 3, Mistral)都以SafeTensors格式发布,但Ollama不能直接加载这些文件。
要让Ollama运行SafeTensors模型,我们必须遵循一个关键的中间步骤:将SafeTensors模型转换为GGUF格式。
本文将详细介绍这一转换过程,并提供实操性的代码示例。
先决条件
你需要准备以下工具和环境:
- Python环境:推荐使用3.10+。
- Ollama:已安装并运行。
- Hugging Face库:用于下载和处理模型权重。
- llama.cpp工具链:用于执行实际的GGUF转换和量化。
1
2
3
4
5
6
7
8
9
10
11 # 1. 安装必要的Python库
pip install torch transformers accelerate safetensors
# 2. 克隆并编译llama.cpp (用于获取转换脚本)
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make
# 3. 安装llama.cpp的Python依赖
pip install -r requirements.txt
cd ..
步骤一:准备SafeTensors模型权重
假设我们使用一个小型模型,例如TinyLlama/TinyLlama-1.1B-Chat-v1.0(通常以SafeTensors发布)。我们将使用Hugging Face的transformers库将其下载到本地目录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import os
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_ID = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
LOCAL_MODEL_PATH = "./tinyllama_safetensors_weights"
# 确保目录存在
os.makedirs(LOCAL_MODEL_PATH, exist_ok=True)
print(f"Downloading model {MODEL_ID}...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(MODEL_ID, torch_dtype=torch.float16)
# 保存为标准的PyTorch/HF格式(如果原始下载已经是SafeTensors,此步确保所有必要文件到位)
tokenizer.save_pretrained(LOCAL_MODEL_PATH)
model.save_pretrained(LOCAL_MODEL_PATH, safe_serialization=True)
print(f"Model weights saved to: {LOCAL_MODEL_PATH}")
步骤二:转换为GGUF格式(FP16/FP32)
接下来,我们使用llama.cpp/convert.py脚本将Hugging Face格式的权重转换为GGUF格式。这一步会生成一个全精度(FP16或FP32)的GGUF文件。
确保你在llama.cpp目录的父目录执行以下操作:
1
2
3
4
5
6
7
8
9
10
11 # 假设LOCAL_MODEL_PATH = ./tinyllama_safetensors_weights
PYTHON_MODEL_PATH=./tinyllama_safetensors_weights
GGUF_OUTPUT_FP16=./tinyllama-fp16.gguf
# 运行转换脚本
python llama.cpp/convert.py \
$PYTHON_MODEL_PATH \
--outfile $GGUF_OUTPUT_FP16 \
--outtype f16
echo "Conversion to FP16 GGUF complete: $GGUF_OUTPUT_FP16"
步骤三:量化GGUF模型
虽然FP16 GGUF可以直接运行,但在边缘设备上,量化(Quantization)是提升速度和减少内存占用的关键。最常用和推荐的量化等级是Q4_K_M。
我们将使用llama.cpp/quantize二进制文件进行量化。
1
2
3
4
5
6
7
8 INPUT_GGUF=./tinyllama-fp16.gguf
QUANTIZED_GGUF=./tinyllama-q4km.gguf
QUANTIZATION_METHOD=Q4_K_M
# 执行量化操作
./llama.cpp/quantize $INPUT_GGUF $QUANTIZED_GGUF $QUANTIZATION_METHOD
echo "Quantization complete. Final model: $QUANTIZED_GGUF"
步骤四:在Ollama中创建和运行模型
Ollama通过Modelfile来管理自定义模型。我们需要创建一个简单的Modelfile,指向我们刚刚生成的GGUF文件。
创建一个名为Modelfile的文件:
1
2
3
4
5
6
7 cat > Modelfile <<EOF
# Modelfile for TinyLlama Q4_K_M
FROM ./tinyllama-q4km.gguf
PARAMETER stop "<|im_end|>"
PARAMETER temperature 0.8
SYSTEM "You are a friendly and concise AI assistant."
EOF
现在,使用ollama create命令将模型导入到Ollama中(命名为tinyllama-custom):
1
2
3
4
5 # 导入模型
ollama create tinyllama-custom -f ./Modelfile
# 运行模型
ollama run tinyllama-custom
你现在可以和这个基于SafeTensors转换而来的GGUF模型进行交互了。通过这种方式,所有Hugging Face上发布的SafeTensors模型都可以通过GGUF格式,在Ollama平台上获得极佳的推理性能。
汤不热吧