查看原文
其他

Ollama 升级!支持一键拉取Huggingface上所有的模型,太方便了!(vLLM、Fastgpt、Dify、多卡推理)

Aitrainee AI进修生
2024-12-28

🍹 Insight Daily 🪺

Aitrainee | 公众号:AI进修生

Hi,这里是Aitrainee,欢迎阅读本期新文章。

我记得,梦的开始,源于Ollama。很早以前的一篇文章教大家如何通过 Ollama 来使用开源 LLM,许多人最初接触 AI 时也是从Ollama开始的。Ollama 之所以出色,是因为它使用了 GGML 格式,这是一种‘轻量版’的大语言模型,以较低精度运行,能够轻松适配普通硬件。这使得在本地系统上运行这些模型变得简单高效,真正为 AI 的广泛应用铺平了道路。

今天,Ollama变得更好了,这次更新效果相当大,因为它基本上打开了Ollama直接使用各种模型的闸门。

以前,我们只能下载ollama models注册表中已有的模型,其实这个东西挺不方便的,比如以前搜什么Llama3.1 70B chinese版都没有,还得自己去Huggface找然后自定义构建。

而现在,你可以使用单个 ollama run 命令运行 Hub 上 45K 个GGUF模型中的任何一个,而无需创建新的Modelfile。

你需要做的就是:

ollama run hf.co/{username}/{reponame}:latest

例如,要运行 Llama 3.2 1B,你可以执行以下命令:

ollama run hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF:latest

如果您想运行特定的量化模型,只需指定量化类型:

ollama run hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF:Q8_0

就是这样!这次更新后,它将过去的几个步骤(指自己构建模型)减少为一个简单的命令,即可下载、安装、配置和运行模型。让事情变得更容易和用户友好(这就是直接使用 Ollama 而不是 llama.cpp 的全部意义)。⚡

你现在可以把Ollama注册表丢进垃圾箱了,不过说实话,等待Ollama注册表兼容更多模型也是挺不可能的,因为这意味着让Ollama官方去托管所有的模型以至于成为第二个Huggface。

更新Ollama文档参考: https://huggingface.co/docs/hub/en/ollama

你不能使用ollama直接加载本地存在的GGUF文件,你从HF拉取的模型文件,ollama会重命名为哈希字符串,这意味着你只能重新拉取而不能使用你以前下载下来的。

如图中,有人提出可以通过创建硬链接的方式来同时满足Ollama和其他应用程序的需求。即,在不复制实际数据的情况下,通过操作系统层面的技术手段让同一个物理文件能够以不同名称存在于系统中,从而使得两边都能顺利访问所需资源。

完了,这篇文章就写完了,还是再讲点吧。

我会继续介绍VLLM和Ollama的单节点多卡推理,哦,还有Huggface、modelscope模型下载,然后简单过过Dify、FastGPT的模型接入,相关嵌入、重排模型部署、Llama.cpp使用、GGUF模型的合并、Ollama自定义模型的构建等等,可能会有点长。

LLM模型拉取(镜像、ModelScope)

使用这篇文章介绍的四种方法,上面Ollama拉取hug模型,也需要更换镜像,详细如这篇文章

https://blog.csdn.net/m0_59741202/article/details/135025946

了解完上面这篇文章后,我需要补充一些命令:

有时候我们需要下载其中一个模型,就可以使用aria2c 、huggingface-cli这些命令

一个仓库下其中一种GGUF模型的多个文件批量下载:

huggingface-cli download --resume-download --local-dir-use-symlinks False --include "qwen2.5-72b-instruct-q8_0-*.gguf" --local-dir qwen2.5-72b-instruct-q8

或者你可以使用aria2c+写脚本(循环之类的)

huggingface中需下载认证的模型有两种命令

VLLM 单节点多卡推理

Ollama在多卡运行大一点的,比如32B、72B这些模型的时候太慢了,它适合单人AI问答,不太适合提供生产服务,或是接入生产工作流,而Vllm适合后者,它是一个主流的LLM加速框架之一。

在CUDA版本12.1的情况下,安装VLLM相对来说还比较简单

# (Recommended) Create a new conda environment.conda create -n myenv python=3.10 -yconda activate myenv
# Install vLLM with CUDA 12.1.pip install vllm

如果你是要运行Qwen2 VL这种视觉模型,你应该先安装 vLLM,然后再安装 transformers 的开发版本

pip install vllmpip install git+https://github.com/huggingface/transformers@21fac7abba2a37fae86106f87fcf9974fd1e3830 accelerate

安装完vllm框架之后,启动模型服务一共有两种,一种是直接运行,他会自己去HuggingFace 下载模型(记得使用镜像)

vllm serve NousResearch/Meta-Llama-3-8B-Instruct --dtype auto --api-key token-abc123

或者使用来自ModelScope的模型,需要设置环境变量:

export VLLM_USE_MODELSCOPE=True

另外一种是加载本地模型并运行

vllm serve /home/ly/qwen2.5/Qwen2.5-32B-Instruct/ --tensor-parallel-size 8 --dtype auto --api-key 123 --gpu-memory-utilization 0.95 --max-model-len 27768  --enable-auto-tool-choice --tool-call-parser hermes --served-model-name Qwen2.5-32B-Instruct --kv-cache-dtype fp8_e5m2

Vllm的参数很多,上面这串命令使用的参数就是我们常用的,这几个参数还是挺影响模型运行的性能的,

--tensor-parallel-size是用于分布式推理的参数,设置为一就是单卡推理,也就是8卡推理(ollama的在文末),单节点多卡推理是说一台机子上有多个GPU推理,多节点多卡推理是说多个机子多GPU推理。

下面参数影响篇幅有限,具体就不再详细说明了。

▲ Vllm几个参数影响并发性能表

Vllm指定某块GPU运行模型是这样的

CUDA_VISIBLE_DEVICES=6 vllm serve /home/ly/qwen2.5/Qwen2-VL-7B-Instruct --dtype auto --tensor-parallel-size 1 auto --api-key 123 --gpu-memory-utilization 0.5 --max-model-len 5108 --enable-auto-tool-choice --tool-call-parser hermes --served-model-name Qwen2-VL-7B-Instruct --port 1236

Vllm不支持启动一个服务就可以随机切换其他模型(ollama支持),你通常需要为每一个模型单独运行一次vllm命令,并且每个模型都要提供不同的端口,比如他默认的是8000端口,而我上一个命令使用的是1236端口,你可以使用Tmux让你的每个Vllm服务运行再后台不受终端关闭影响。

嵌入、重排模型

Vllm目前好像不支持嵌入和重排这些模型。

目前嵌入模型排行榜在此:

https://huggingface.co/spaces/mteb/leaderboard

阿里的gte不错,中文环境下可以考虑使用这个1.5B或7B模型

以前使用的bge-base-zh-v1.5量级还是比较小的

en版排名也不是很高

text-embeddings-inference(https://github.com/huggingface/text-embeddings-inference)项目提供这些重排和嵌入模型的部署,

在Dify中接入两个模型会用到这个项目

Dify的Ollama接入界面是没有重排模型的

FastGPT Docs中也有关于重排模型的Docker部署

# auth token 为mytokendocker run -d --name reranker -p 6006:6006 -e ACCESS_TOKEN=mytoken --gpus all registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-base:v0.1

FastGPT、Dify开源模型接入

FastGPT使用Oneapi接入模型,配置各种模型都挺方便的,以前有写过:

Kimi+Langchain+FastGPT:文档转LLM微调数据集 / QA问答对生成、Kimi 128KAPI免费接入!

One-API:让国内LLM、Coze等跑通仅支持OpenAI API的开源项目 | 保姆级教程、可配合免费LLM API使用!

Dfiy就简单讲讲:

1、Ollama接入

2、用的比较多的肯定是OpenAl-API-compatible,即OpenAI兼容格式,比如Vllm就需要用这个接入,OpenAl-API-compatible+Vllm(Vllm默认跑在8000端口下):

3、Oneapi+OpenAl-API-compatible,Oneapi是3001端口,记得把他的API KEY填入:

Oneapi中有嵌入模型也是一样的接入方法

GGUF合并、Ollama模型构建

Ollama有三种方式构建自定义模型(虽然说这次更新之后我们不需要了),

https://github.com/ollama/ollama/blob/main/docs/modelfile.md

特别是第3种GGUF,GGUF有些量化模型需要合并在一起才能使用,也是使用Ollama构建自定义模型得前置条件

合并的方式有两种(Huggface仓库有些会有说明),第一种,使用cat

cat swallow-70b-instruct.Q6_K.gguf-split-* > swallow-70b-instruct.Q6_K.ggufcat swallow-70b-instruct.Q8_0.gguf-split-* > swallow-70b-instruct.Q8_0.gguf

这种我好像合并过一些模型,但是无法正常使用。

二:使用llama.cpp

克隆llama.cpp仓库

git clone git@github.com:ggerganov/llama.cpp.gi

然后使用llama-gguf-split合并

./llama-gguf-split --merge qwen2.5-7b-instruct-q4_0-00001-of-00002.gguf qwen2.5-7b-instruct-q4

记住只需要指定第1个gguf文件,如qwen2.5-7b-instruct-q4_0-00001-of-00002.gguf,不要写入所有gguf文件,否则第2个gguf会作为合并文件,然后被置为0,也就会导致你下了半天的模型文件直接被他损坏了,这是一个巨坑。当初就是看了一篇这样的文章,被误人子弟了。

对了,如果ollama linux版本国内网络问题如果下载不了,这篇有说明,这有点小错误,

升级Ollama!MiniCPM-V2_6图像识别模型上线,适用于手机上单张图片、多张图片和视频的 GPT-4V 级 MLLM

bin后面加一个ollama,即:ollama-linux-amd64/bin/ollama

关于ollama构建自定义模型,网上有许多教程就是这里来的,比如

https://mp.weixin.qq.com/s/q73MQWwxNwB-cnKpqVDORw

但是文章合并模型这里就是错的,不要把GGUF所有文件写进命令。

再回到构建模型,想说明的是Docker下构建模型需要进行模型数据卷挂载:

我们这样启动启动ollama docker服务,指定在5,7GPU上进行多卡推理

docker run -d -e CUDA_VISIBLE_DEVICES=5,7 -e OLLAMA_FLASH_ATTENTION=1 -e OLLAMA_NUM_PARALLEL=64 -v ollama:/root/.ollama -v /home/ly/:/mnt/data -p 11436:11434 --name ollama6 ollama/ollama serve

Modelfile.txt文件这样写:

FROM "/mnt/data/Qwen2.5-72B-Instruct-GGUF/merge/qwen2.5-72b-instruct-q2_k.gguf"
TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>"""PARAMETER stop "<|start_header_id|>"PARAMETER stop "<|end_header_id|>"PARAMETER stop "<|eot_id|>"PARAMETER stop "<|reserved_special_token"

FROM所指的路径/mnt/data/就是 Ollama Docker 容器内部的卷,对应宿主机/home/ly/下存放的模型

然后我们执行下面命令构建模型

docker exec ollama6 ollama create qwen2.5-72b-instruct-q2_k -f /mnt/data/Modelfile.txt

就能构建成功,像ollama pull下来的模型一样使用。

好的,总得来说就是这样,借着Ollama更新的机会,顺便分享下LLM部署的一些实践,虽然说的有点简单就是了。

🌟希望这篇文章对你有帮助,感谢阅读!如果你喜欢这系列文章请以 点赞 / 分享 / 在看 的方式告诉我,以便我用来评估创作方向。

👽Submission:kristjahmez06@gmail.com

知音难求,自我修炼亦艰

抓住前沿技术的机遇,与我们一起成为创新的超级个体

(把握AIGC时代的个人力量)

点这里👇关注我,记得标星哦~

一键三连「分享」、「点赞」和「在看」

科技前沿进展日日相见 ~ 

修改于
继续滑动看下一个
AI进修生
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存