首先,先跟各位小伙伴说一句 Sorry 。上一篇文章《【AIGC】本地部署通义千问 1.5 (PyTorch)》并没有考虑企业成本问题,虽然代码可以跑通,但是中小型企业想通过该代码实现项目落地还是比较困难的。为此,本文将采用 GGUF 预量化大模型结合 Ollama 对代码进行修改,给小伙伴们演示如何逐步实现非 GPU 资源的本地整合方案。
题外话:其实在上一篇文章发布之后我就已经意识到,大伙儿最大的问题并不是如何将人工智能集成到项目,而是在有限“资源”的情况下要如何将“人工智能+”落地。坦白说现在很多中小型企业为了“求生存”也是苦苦支撑着,要想申请资源去做研发几乎不太可能(不缩减资源就算好的了)。在这种情况下,如何利用好手头的资源是关键… 过往 toB、toG、toC 等项目一般都会选用 CPU 算力为主的服务器。在实际运营后发现,长时间耗尽服务器资源的情况其实很少,那么如何利用好闲置的服务器资源将是突破的关键,而 GGUF 预量化大模型让我看到了希望。
先说明一下什么是 GGUF ?
GGUF(GPT-Generated Unified Format)是一种大模型文件格式,由著名开源项目 llama.cpp 创始人 Georgi Gerganov 提出并定义,是一种针对大规模机器学习模型设计的二进制格式文件规范,主要用于高效存储和交换大模型的预训练结果。GGUF 的主要优势在于,它能够将原始的大模型预训练结果经过特定优化后转换成这种格式,从而可以更快地被载入使用,并消耗更低的资源。最最最关键的一点是,允许用户使用 CPU 来运行 LLM。
那么废话不多说了,我们直接开始吧。
还是老规矩选用 Qwen 大模型,先找到“合适”的 Qwen 版本,这里由于我电脑使用的是一台老 Mac 了,选用 14B 的模型就好。有条件的小伙伴可以选择 32B 或者 70B 的,如下图:
找到对应版本后就可以通过 huggingface-cli 进行下载了,如下图:
(base) yuanzhenhui@MacBook-Pro ~ % huggingface-cli download --resume-download Qwen/Qwen1.5-14B-Chat-GGUF qwen1_5-14b-chat-q4_k_m.gguf --local-dir-use-symlinks False
Consider using `hf_transfer` for faster downloads. This solution comes with some limitations. See https://huggingface.co/docs/huggingface_hub/hf_transfer for more details.
downloading https://hf-mirror.com/Qwen/Qwen1.5-14B-Chat-GGUF/resolve/main/qwen1_5-14b-chat-q4_k_m.gguf to /Users/yuanzhenhui/.cache/huggingface/hub/models--Qwen--Qwen1.5-14B-Chat-GGUF/blobs/46fbff2797c39c2d6aa555db0b0b4fe3f41b712a9b45266e438aa9a5047c0563.incomplete
qwen1_5-14b-chat-q4_k_m.gguf: 100%|█████████████████████████████████████████████████████████████████████████████████| 9.19G/9.19G [17:43<00:00, 2.22MB/s]
/Users/yuanzhenhui/.cache/huggingface/hub/models--Qwen--Qwen1.5-14B-Chat-GGUF/snapshots/1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8/qwen1_5-14b-chat-q4_k_m.gguf
(base) yuanzhenhui@MacBook-Pro ~ % cd /Users/yuanzhenhui/.cache/huggingface/hub/models--Qwen--Qwen1.5-14B-Chat-GGUF/snapshots/1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8/
(base) yuanzhenhui@MacBook-Pro 1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8 % vim qwen.mf
以上的 huggingface-cli 命令中设置了 --local-dir-use-symlinks False
参数,这是因为我们并不是在项目中直接使用 gguf,因此创建软连接对于我们来说并没有任何意义。由于我们还需使用 Ollama 去重塑模型,为此需要在 gguf 文件所在的目录下创建一个配置文件 qwen.mf(这里为了方便所以就跟 gguf 放在同一个目录下了)。qwen.mf 文件内只需要加上一句话:
FROM /Users/yuanzhenhui/.cache/huggingface/hub/models--Qwen--Qwen1.5-14B-Chat-GGUF/snapshots/1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8/qwen1_5-14b-chat-q4_k_m.gguf
然后就可以重塑模型了(Ollama 的安装这里就不再叙述了,现网上随便一查就有,而且安装起来也不复杂,相信你们能够搞定的)。如下图:
(base) yuanzhenhui@MacBook-Pro 1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8 % ollama create qwen1_5-14b -f qwen.mf
transferring model data
creating model layer
using already created layer sha256:46fbff2797c39c2d6aa555db0b0b4fe3f41b712a9b45266e438aa9a5047c0563
writing layer sha256:7b7752786c7f521fcda8c3fcc245b241641ecfef1c9559b8f1c07bbabf782b83
writing manifest
success
(base) yuanzhenhui@MacBook-Pro 1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8 % ollama list
NAME ID SIZE MODIFIED
qwen1_5-14b:latest c49d529b8cb7 9.2 GB 26 seconds ago
(base) yuanzhenhui@MacBook-Pro 1e2e136ec2ff4e5ea297d4da75581b6bd4b40ca8 % cd /Users/yuanzhenhui/.cache/huggingface/hub
(base) yuanzhenhui@MacBook-Pro hub % ls
models--BAAI--bge-large-zh-v1.5 models--Qwen--Qwen1.5-14B-Chat-GGUF version.txt
(base) yuanzhenhui@MacBook-Pro hub % rm -rf models--Qwen--Qwen1.5-14B-Chat-GGUF/
在模型重塑之后原本通过 huggingface-cli 下载的模型就基本没用了,就找到文件路径删除即可(释放存储空间)。接下来可以尝试在 Ollama 中运行该模型,如下图:
(base) yuanzhenhui@MacBook-Pro hub % ollama run qwen1_5-14b:latest
>>> 中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?
中国传统中医理论,特别是中医学,认为全身乏力和心跳过速可能是多种因素导致的,包括体质、情绪、饮食、环境以及疾病等。以下是一些可能的中医解释和处理方法:
1. 气血不足:中医认为人体的动力源于气血,如果气血运行不畅或亏虚,可能会出现乏力的症状。此时需要补益气血。
2. 心肾不交:心跳过速可能是由于心火上炎,肾水不足导致,这在中医理论中被称为“心肾不交”。可能通过调整饮食、药物治疗或者针灸来改善这种情况。
3. 精神压力过大:长期的精神压力也可能导致乏力和心动过速,中医认为可以通过调理情志,如进行适当的运动、冥想或接受心理咨询来缓解。
4. 阴阳失衡:如果人体的阴阳平衡失调,可能会出现乏力等症状。中医会通过调整饮食、生活方式或者药物治疗来恢复阴阳平衡。
然而,以上解释和处理方法并非直接针对西医诊断的症状,例如心脏疾病等。在实际医疗中,中医理论通常与现代医学结合使用,以提供全面的健康管理。如果症状严重或持续,建议及时就医,进行全面的身体检查和必要的治疗。
用 Stream 模式响应速度非常的快。
接下来就是整合到项目里面了,首先我们先用 pip 安装一下 ollama 组件(非常简单不说了)。之后将代码修改成以下内容:
import time
import ollama
model_name = "qwen1_5-14b:latest"
def ask_qwen(question):
start_time = time.time()
response_text = ''
try:
response = ollama.chat(model=model_name, messages=question)
response_text = response["message"]["content"]
except Exception as e:
print(f"Error: {e}")
finally:
execution_time = time.time() - start_time
print(f">>> function ask_qwen totally use {execution_time} seconds")
return response_text
if __name__ == '__main__':
prompt = "中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?"
question = [{"role": "user", "content": prompt}]
response = ask_qwen(question)
print(">>> "+response)
代码比 pytorch 版本的还要简洁,ollama 组件已经帮我们做了大部分的工作了。这里只需要将模型名称(model_name)和问题(question)传入 chat 函数即可。由于用的是 chat 函数因此 question 参数是一个数组集合,支持多轮问答。生成结果如下:
(transformer) (base) MacBook-Pro:python yuanzhenhui$ /Users/yuanzhenhui/anaconda3/envs/transformer/bin/python /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/learning/local_model.py
>>> function ask_qwen totally use 89.34364295005798 seconds
>>> 中医理论认为,全身乏力和心跳过速可能是由多种原因导致的。中医将人体视为一个整体,疾病的发生是内外因素综合作用的结果。
1. 肾虚:中医认为肾主骨生髓,肾气虚弱可能导致身体乏力。同时,肾与心有密切关系,肾虚可能影响心脏功能,引起心跳过速。
2. 心血不足:如果心血供应不足,也可能出现全身无力、心跳加速的症状,这在中医中称为“心血瘀阻”。
3. 气滞血瘀:情绪压力大或者生活作息不规律可能导致气滞血瘀,进一步影响到脏腑功能,引发全身乏力和心跳过速。
4. 精神因素:中医认为情志因素对身体健康有重要影响。长期的精神紧张、焦虑等都可能引起身体的不适反应。
然而,针对具体的症状,现代医学可能会进行更详细的检查,如心电图、血液检查等,以找出病因。中医理论和西医相结合,可以帮助患者找到更合适的治疗方法。如果症状持续或加重,建议及时就医。
在非 Stream 模式下总耗时为 89 秒(另外还跑了两个 python 应用在整理数据,并且重启了一遍 Ollama 需要重新加载模型到内存所以有点慢)。在整个运行当中,没有发现对其他程序有什么太大的影响。
如果能够通过一般服务器资源跑起来的话,后面只需要将闲置资源往上堆应该就可以了吧(大概?)。目前这应该是能找到的最简便的实现方案了,接下来还会继续探索看看能否在有限资源下做到最好。