5种搭建LLM服务的方法和代码示例

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本文介绍了5种搭建开源大型语言模型服务的方法,包括使用Anaconda+CPU、Anaconda+GPU、Docker+GPU、Modal和AnyScale。CPU方法适合本地低门槛测试,但速度较慢;GPU方法显著提升速度,Docker简化环境配置,适合大规模部署;Modal提供按需付费的GPU服务,适合试验和部署;而AnyScale则以低门槛和低成本访问开源模型。每种方法都有其优缺点,选择取决于具体需求和资源。

在不断发展的大型语言模型(LLMs)领域中,用于支持这些模型的工具和技术正以与模型本身一样快的速度进步。在这篇文章中,我们将总结5种搭建开源大语言模型服务的方法,每种都附带详细的操作步骤,以及各自的优缺点。

1、Anaconda + CPU

我们首先介绍门槛最低的入门级方法,因为这个方法不需要GPU,基本上只要有一个还不错的CPU和足够RAM就可以运行。

这里我们使用llama.cpp及其python绑定llama-cpp-python

 pip install llama-cpp-python[server] \
   --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cpu

创建一个名为models/7B的目录来存储下载的模型。然后使用命令下载GGUF格式的量化模型:

 mkdir -p models/7B
 wget -O models/7B/llama-2-7b-chat.Q5_K_M.gguf https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q5_K_M.gguf?download=true

然后就可以运行以下命令启动服务器:

 python3 -m llama_cpp.server --model models/7B/llama-2-7b-chat.Q5_K_M.gguf

将环境变量MODEL设置为下载模型的路径。然后运行openai_client.py脚本就可以访问我们的查询服务器。openai_client.py使用OpenAI库调用LLM服务器并打印响应。

 messages=[
     {"role": "system", "content": "You are a helpful assistant."},
     {
         "role": "user",
         "content": "What are the names of the four main characters of South Park?",
     },
 ]

因为这个方法是门槛最低的,所以他的速度也是最慢的,基于Intel®Core™i9-10900F CPU @ 2.80GHz的系统的处理时间大概是13秒左右,所以这个方法一般用作我们的本地测试服务(如果你GPU不够的话)。

2、Anaconda + GPU

前面的CPU方法是非常慢的,为了加快速度我们将使用vllm,这是一个专门为有效利用gpu而设计的工具。

 pip install vllm

执行以下命令来启动服务器:

 python -m vllm.entrypoints.openai.api_server --model TheBloke/Llama-2-7B-Chat-AWQ --api-key DEFAULT --quantization awq --enforce-eager

这将下载AWK量化模型并启动一个OpenAI兼容服务器,我们可以像使用llama.cpp一样进行查询。

“— enforce-eager”是费差个重要的,因为它允许模型在我的10G VRAM GPU中运行,没有内存不足的错误。

在Nvidia RTX 3080 GPU和Intel®Core™i9-10900F CPU的系统下处理时间只有0.79s。CPU快20倍左右,这就是为什么GPU现在都那么贵的一个原因。

这种方式可以用做我们测试服务器或者在线上的小规模部署,如果要求不高,也可以当作生产环境来使用,当然维护起来非常麻烦。

3、Docker + GPU

vllm有很多依赖,如果要批量的安装是一件非常耗时的事情。好在vllm还提供了一个预构建的docker映像,它已经包含了所需的所有库。

对于ubuntu,我们首先安装Nvidia CUDA Toolkit,如果安装了则跳过

 sudo apt install nvidia-cuda-toolkit

然后添加Nvidia Docker存储库并安装Nvidia Container Toolkit:

 distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
 curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
 curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
 sudo systemctl restart docker

配置Docker使用Nvidia runtime:

 sudo tee /etc/docker/daemon.json <<EOF
 {
     "runtimes": {
         "nvidia": {
             "path": "/usr/bin/nvidia-container-runtime",
             "runtimeArgs": []
         }
     }
 }
 EOF
 sudo pkill -SIGHUP dockerd

然后就可以运行我们的模型了

 docker run --runtime nvidia --gpus all \
     -v ~/.cache/huggingface:/root/.cache/huggingface \
     -p 8000:8000 \
     --ipc=host \
     vllm/vllm-openai:latest \
     --model TheBloke/Llama-2-7B-Chat-AWQ \
     --quantization awq --enforce-eager

这里我们使用-v参数将本地的磁盘映射到容器中,这样所有的容器都可以使用huggingface的模型缓存,避免了重复下载。

docker的部署方式处理一个查询的时间在0.8s左右与使用相同硬件在Anaconda上运行vllm相似。

使用docker可以大大简化我们服务器的环境配置,配合集群管理脚本可以适用于大规模的服务部署。

上面的方式都适用于本地和有GPU主机/集群的方式,下面我们介绍2个比较简单的云GPU的方案,这两个方案都是按需付费的。

4、modal

Modal可以简化无服务器应用程序的部署,特别是那些利用GPU资源的应用程序。它的一个突出的特点是它的计费模式,它确保用户只在他们的应用程序使用GPU资源的持续时间内收费。这意味着当你的应用程序不被使用时则不会收费。

Modal还提供每月30美元的优惠,为用户提供了充分的机会来探索和试验部署gpu加速的应用程序,而无需支付前期费用,这也是我们介绍他的一个原因,因为每月目前还能白嫖30美元,哈。

首先安装:

 pip install modal

然后配置modal的运行环境,这一步需要登陆了

 modal setup

我们这里的vllm_modal_deploy.py改编Modal的官方教程。这个脚本最重要的一点是定义GPU。这里我选择了nvidia T4,因为量化模型非常小:

  # https://modal.com/docs/examples/vllm_mixtral
 import os 
 import time

 from modal import Image, Stub, enter, exit, gpu, method

 APP_NAME = "example-vllm-llama-chat"
 MODEL_DIR = "/model"
 BASE_MODEL = "TheBloke/Llama-2-7B-Chat-AWQ"
 GPU_CONFIG = gpu.T4(count=1)

然后定义运行代码的docker镜像:

 vllm_image = ( # https://modal.com/docs/examples/vllm_mixtral
     Image.from_registry("nvidia/cuda:12.1.1-devel-ubuntu22.04", add_python="3.10")
     .pip_install(
         "vllm==0.3.2",
         "huggingface_hub==0.19.4",
         "hf-transfer==0.1.4",
         "torch==2.1.2",
     )
     .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"})
     .run_function(download_model_to_folder, timeout=60 * 20)
 )

定义App:

 stub = Stub(APP_NAME)

最后编写预测的类:

 class Model:  
     @enter()  # Lifecycle functions
     def start_engine(self):
         import time

         from vllm.engine.arg_utils import AsyncEngineArgs
         from vllm.engine.async_llm_engine import AsyncLLMEngine

         print("🥶 cold starting inference")
         start = time.monotonic_ns()

         engine_args = AsyncEngineArgs(
             model=MODEL_DIR,
             tensor_parallel_size=GPU_CONFIG.count,
             gpu_memory_utilization=0.90,
             enforce_eager=False,  # capture the graph for faster inference, but slower cold starts
             disable_log_stats=True,  # disable logging so we can stream tokens

@enter()装饰器被用来定义生命周期方法来处理代码的初始化之类的事情。所以我们在这里加载模型并设置生成管道。如果查询触发了此方法,则意味着有一个“冷启动”,也就是第一次启动的耗时会比较长。

定义生成函数:

 @stub.function()
 def generate(user_question: str):
     model = Model()

     print("Sending new request:", user_question, "\n\n")

     result = ""
     for text in model.completion_stream.remote_gen(user_question):
         print(text, end="", flush=True)
         result += text

     return result

最后就是使用命令行进行部署

 modal deploy vllm_modal_deploy.py

部署完成后就可以从python调用这个函数:

 import timeit

 import modal

 APP_NAME = "example-vllm-llama-chat"
 f = modal.Function.lookup(APP_NAME, "generate")

 start_time = timeit.default_timer()

 print(f.remote("What are the names of the four main characters of South park?"))

 elapsed = timeit.default_timer() - start_time

 print(f"{elapsed=}")

经过我的测试第一次启动大约需要37秒。这包括启动时间和处理时间。应用程序已经启动时的延迟是2.8秒。这些都是在Nvidia T4上运行的,所以3秒还是可以接受的。

需要注意:container_idle_timeout的值是用来回收容器的,超过了这个时间值会进行回收,这样再次启动就会调用初始化的过程,也就是我们说的冷启动。但是因为modal的计费方式,再未回收前都是计费的,所以请谨慎修改。

最后说下费用:Modal的Nvidia T4收费是0.000164 /秒 或 0.59 /小时。上面我们使用了几百秒的计算时间,花费了大约0.1美元。

5、AnyScale

Anyscale与Modal类似,但他更专注于提供随时可用的开源模型。我们可以使用Anyscale API的URL直接调用它们。

首先注册并获得API密钥。你可以使用他们提供给新用户的10*$免费套餐来运行本教程。

接下来,我们将使用与之前相同的openai_client.py脚本:

 export API_KEY="CHANGEME"
 export MODEL="meta-llama/Llama-2-7b-chat-hf"
 export BASE_URL="https://api.endpoints.anyscale.com/v1"
 python openai_client.py

不需要任何的设置,只要我们在发送请求时修改参数就可以访问不同的模型了,这就是Anyscale的优势

这个请求的延迟大约是3.7秒,还算不错。但是AnyScale是按照令牌来计费的(与OpenAI的API相同)LLama2 7B 的价格是0.15*$ / 1M 令牌。我们运行这个示例花费不到1/10美分。

可以看到AnyScale还是很不错的,对于开源模型我们直接可以拿来使用,并且花费也很低,如果你没有GPU,这个可以作为模型测试的首选平台,一个月几十美元基本上够我们测试当月新发布的所有模型了。

总结

当涉及到服务大型语言模型(llm)时,有各种各样的方法可以选择:

对喜欢本地服务器设置的人来说,使用带有CPU的Anaconda提供了较低的进入门槛,gpu加速的Anaconda环境可以缓解延迟问题,但它仍然面临可伸缩性和对本地资源的依赖方面的限制,特别是在处理大型llm时。

Docker可以简化Python环境配置,可以适应大批量的部署。

Modal提供了一种更灵活的按次付费计算解决方案,使其具有成本效益和易于设置的吸引力

AnyScale提供了较低的进入门槛对于那些追求简单的人来说是一个非常好的选择

我们介绍的这些方法是一个很好的起点,还有很多其他服务比如runpod和AWS,但这些方法需要更多的运维知识,并且在小规模部署上优势并不明显,所以要考虑对针对特定需求和要求量身定制的最佳方案还需要进行全面评估。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
20天前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
1月前
|
人工智能 数据挖掘
AI长脑子了?LLM惊现人类脑叶结构并有数学代码分区,MIT大牛新作震惊学界!
麻省理工学院的一项新研究揭示了大型语言模型(LLM)内部概念空间的几何结构,与人脑类似。研究通过分析稀疏自编码器生成的高维向量,发现了概念空间在原子、大脑和星系三个层次上的独特结构,为理解LLM的内部机制提供了新视角。论文地址:https://arxiv.org/abs/2410.19750
74 12
|
1月前
|
自然语言处理 资源调度 并行计算
从本地部署到企业级服务:十种主流LLM推理框架的技术介绍与对比
本文深入探讨了十种主流的大语言模型(LLM)服务引擎和工具,涵盖从轻量级本地部署到高性能企业级解决方案,详细分析了它们的技术特点、优势及局限性,旨在为研究人员和工程团队提供适合不同应用场景的技术方案。内容涉及WebLLM、LM Studio、Ollama、vLLM、LightLLM、OpenLLM、HuggingFace TGI、GPT4ALL、llama.cpp及Triton Inference Server与TensorRT-LLM等。
177 7
|
2月前
|
自然语言处理 开发者
多模态大模型LLM、MLLM性能评估方法
针对多模态大模型(LLM)和多语言大模型(MLLM)的性能评估,本文介绍了多种关键方法和标准,包括模态融合率(MIR)、多模态大语言模型综合评估基准(MME)、CheckList评估方法、多模态增益(MG)和多模态泄露(ML),以及LLaVA Bench。这些方法为评估模型的多模态和多语言能力提供了全面的框架,有助于研究者和开发者优化和改进模型。
191 5
|
2月前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
271 12
|
3月前
|
自然语言处理 数据中心
Scaling LLM Test-Time Compute Optimally: 一种更有效的方法
【10月更文挑战第14天】本文探讨了大型语言模型(LLMs)在测试时通过增加计算资源来提升性能的可能性。研究发现,通过优化测试时计算的分配,特别是采用基于过程的验证器搜索和自适应更新响应分布的方法,LLM可以显著提高对复杂问题的应对能力,甚至在某些情况下超越更大规模的模型。论文提出了“计算最优”策略,旨在根据问题难度自适应调整计算资源,以最大化性能提升。未来工作将聚焦于增强测试时计算缩放、快速评估问题难度及实现自我改进循环。
122 6
|
5月前
|
人工智能 安全 机器人
LLM对齐数据全自动合成!UW华人博士生提出Magpie方法,Macbook Air即可运行
【8月更文挑战第11天】在AI领域,大型语言模型(LLM)的行为对齐一直是个挑战。华盛顿大学研究人员提出名为Magpie的新方法,能自动高效生成高质量指令数据,减少人工干预,提升LLM的对齐效果。通过输入模板,Magpie利用已对齐LLM生成能力自动生成指令数据,仅需少量GPU资源即可创建大规模数据集。实验显示,使用Magpie数据集微调的模型性能媲美传统监督方法。尽管如此,Magpie仍需进一步优化以生成特定领域指令并确保数据安全性。[论文](https://arxiv.org/abs/2406.08464)
202 60
|
4月前
|
存储 机器学习/深度学习 缓存
MemLong: 基于记忆增强检索的长文本LLM生成方法
本文介绍了一种名为MemLong的创新长文本处理方法,该方法通过整合外部检索器显著增强了大型语言模型处理长上下文的能力。MemLong采用轻量级设计,利用不可训练的外部记忆库存储历史上下文和知识,并通过检索相关的块级键值对增强模型输入。其技术优势包括分布一致性、高效训练策略及扩展的上下文窗口,能够在单个GPU上处理长达80k个token的文本,同时保持计算效率和内存控制。实验结果显示,MemLong在多个长文本基准数据集上表现出色,显著提升了语言建模能力和上下文学习效果。
422 1
|
5月前
|
安全 异构计算
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
219 0
为大型语言模型 (LLM) 提供服务需要多少 GPU 内存?
|
5月前
|
机器学习/深度学习 边缘计算 缓存