LLM API
欢迎来到LLM-API项目!这个项目为您打开了大型语言模型(LLMs)的激动人心的世界,提供了一个多功能的API,让您可以轻松地在不同的消费级硬件配置上运行各种LLMs。无论您喜欢在Docker容器中还是直接在本地机器上运行这些强大的模型,这个解决方案都能适应您的偏好。
使用LLM-API,您只需要一个简单的YAML配置文件就可以开始。该应用程序通过自动下载您选择的模型并无缝执行来简化流程。一旦启动,模型就可以通过统一且直观的API访问。
还有一个类似OpenAI风格的客户端,使得利用您选择的LLM的功能变得容易。您可以在llm-api-python找到Python版本。
除此之外,还有一个LangChain集成,进一步扩展了LLM-API的可能性和潜在应用。您可以在langchain-llm-api探索这个集成。
无论您是开发者、研究人员还是爱好者,LLM-API项目都简化了大型语言模型的使用,使其强大功能和潜力对所有人都触手可及。
我们邀请LLM爱好者、开发者、研究人员和创造者加入这个不断成长的社区。您的贡献、想法和反馈对塑造LLM-API的未来至关重要。无论您想在改进核心功能、开发新的集成还是提出改进建议方面进行合作,您的专业知识都将备受欢迎。
已测试
- 使用llama.cpp在CPU上运行不同版本的基于Llama的模型(如Llama、Alpaca、Vicuna、Llama 2)
- 使用GPTQ-for-LLaMa的Llama和Llama 2量化模型
- 通用huggingface pipeline,如gpt-2、MPT
- Mistral 7b
- 使用AWQ的多个量化模型
- 使用llm-api-python的类OpenAI接口
- 支持RWKV-LM
使用方法
要在本地机器上运行LLM-API,您必须有一个正常运行的Docker引擎。以下步骤概述了运行LLM-API的过程:
- 创建配置文件:首先创建一个
config.yaml
文件,按照下面描述的配置(使用config.yaml.example
中的示例)。
models_dir: /models # 容器内的目录
model_family: llama # 也可以是`gptq_llama`或`huggingface`
setup_params:
key: value
model_params:
key: value
setup_params
和model_params
是特定于模型的,请参见下面的模型特定配置。
您可以使用以LLM_API_
为前缀的环境变量覆盖上述任何配置,例如:LLM_API_MODELS_DIR=/models
- 使用Docker运行LLM-API:在终端中执行以下命令:
docker run -v $PWD/models/:/models:rw -v $PWD/config.yaml:/llm-api/config.yaml:ro -p 8000:8000 --ulimit memlock=16000000000 1b5d/llm-api
此命令启动一个Docker容器,挂载您的本地模型目录、配置文件,并映射8000端口以访问API。
或者,您可以使用此存储库中提供的docker-compose.yaml
文件,并使用Docker Compose运行应用程序。执行以下命令:
docker compose up
在首次运行时,LLM-API将根据您config.yaml
文件中setup_params
定义的配置从Hugging Face下载模型。然后,它会相应地命名本地模型文件。后续运行将引用相同的本地模型文件并将其加载到内存中以实现无缝操作。
端点
LLM-API提供了一套适用于所有大型语言模型(LLMs)的标准端点。这些端点使您能够有效地与模型交互。以下是主要端点:
1. 生成文本
- POST /generate
- 请求示例:
{ "prompt": "法国的首都是什么?", "params": { // 额外参数... } }
- 描述:使用此端点根据给定的提示生成文本。您可以包含额外的参数进行微调和自定义。
- 请求示例:
2. 异步文本生成
- POST /agenerate
- 请求示例:
{ "prompt": "法国的首都是什么?", "params": { // 附加参数... } }
- 描述: 此端点用于异步文本生成。它允许您启动可以在后台运行的文本生成任务,同时您的应用程序可以继续运行。
- 请求示例:
3. 文本嵌入
- POST /embeddings
- 请求示例:
{ "text": "法国的首都是什么?" }
- 描述: 使用此端点获取给定文本的嵌入。这对于各种自然语言处理任务(如语义相似度和文本分析)非常有价值。
- 请求示例:
Huggingface transformers
通常可以使用transformer的AutoConfig
、AutoModelForCausalLM
和AutoTokenizer
进行推理的模型可以使用model_family: huggingface
配置运行,以下是一个示例(运行一个MPT模型):
models_dir: /models
model_family: huggingface
setup_params:
repo_id: <repo_id>
tokenizer_repo_id: <repo_id>
trust_remote_code: True
config_params:
init_device: cuda:0
attn_config:
attn_impl: triton
model_params:
device_map: "cuda:0"
trust_remote_code: True
torch_dtype: torch.bfloat16
通过以下方法利用LLM-API的灵活性来配置各种属性:
-
在
config_params
中传递特定的配置属性以微调AutoConfig
。这些属性允许您进一步定制语言模型的行为。 -
通过在
model_params
中指定参数直接修改模型的参数。这些参数会被传递到AutoModelForCausalLM.from_pretrained
和AutoTokenizer.from_pretrained
初始化调用中。
以下是如何在generate
(或agenerate
)端点中使用参数的示例,但请记住,您可以传递transformer的GenerationConfig接受的任何参数:
POST /generate
curl --location 'localhost:8000/generate' \
--header 'Content-Type: application/json' \
--data '{
"prompt": "巴黎的首都是什么",
"params": {
"max_length": 25,
"max_new_tokens": 25,
"do_sample": true,
"top_k": 40,
"top_p": 0.95
}
}'
如果您希望使用GPU加速推理,1b5d/llm-api:latest-gpu
镜像就是为此目的设计的。使用Compose运行Docker镜像时,请考虑使用专门的Compose文件来支持GPU:
docker compose -f docker-compose.gpu.yaml up
注意:目前GPU镜像仅支持linux/amd64
架构
在CPU上使用Llama模型 - 使用llama.cpp
通过在本地config.yaml
文件中配置模型使用,可以简化在CPU上使用Llama的过程。以下是可能的配置:
models_dir: /models
model_family: llama
setup_params:
repo_id: user/repo_id
filename: ggml-model-q4_0.bin
model_params:
n_ctx: 512
n_parts: -1
n_gpu_layers: 0
seed: -1
use_mmap: True
n_threads: 8
n_batch: 2048
last_n_tokens_size: 64
lora_base: null
lora_path: null
low_vram: False
tensor_split: null
rope_freq_base: 10000.0
rope_freq_scale: 1.0
verbose: True
确保指定repo_id和filename参数,以指向托管所需模型的Hugging Face仓库。应用程序随后会为您处理下载。
在此模式下运行可以使用Docker镜像1b5d/llm-api:latest
,还提供了几个镜像以支持不同的BLAS后端:
- OpenBLAS:
1b5d/llm-api:latest-openblas
- cuBLAS:
1b5d/llm-api:latest-cublas
- CLBlast:
1b5d/llm-api:latest-clblast
- hipBLAS:
1b5d/llm-api:latest-hipblas
以下示例演示了可以发送到Llama生成和异步生成端点的各种参数:
POST /generate
curl --location 'localhost:8000/generate' \
--header 'Content-Type: application/json' \
--data '{
"prompt": "巴黎的首都是什么",
"params": {
"suffix": null 或 字符串,
"max_tokens": 128,
"temperature": 0.8,
"top_p": 0.95,
"logprobs": null 或 整数,
"echo": False,
"stop": ["\Q"],
"frequency_penalty": 0.0,
"presence_penalty": 0.0,
"repeat_penalty": 1.1,
"top_k": 40,
}
}'
AWQ量化模型 - 使用AutoAWQ
使用AutoAWQ实现支持AWQ量化,以下是一个示例配置
models_dir: /models
model_family: autoawq
setup_params:
repo_id: <仓库ID>
tokenizer_repo_id: <仓库ID>
filename: <模型文件名>
model_params:
trust_remote_code: False
fuse_layers: False
safetensors: True
device_map: "cuda:0"
要运行此模型,需要支持GPU的Docker镜像 1b5d/llm-api:latest-gpu
docker run --gpus all -v $PWD/models/:/models:rw -v $PWD/config.yaml:/llm-api/config.yaml:ro -p 8000:8000 1b5d/llm-api:latest-gpu
或者你可以使用本仓库中提供的docker-compose.gpu.yaml文件:
docker compose -f docker-compose.gpu.yaml up
在GPU上运行Llama - 使用GPTQ-for-LLaMa
重要提示:在GPU上运行Llama或Llama 2之前,请确保在主机上安装了NVIDIA驱动程序。你可以通过执行以下命令来验证NVIDIA环境:
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi
你应该看到一个显示当前NVIDIA驱动程序版本和相关信息的表格,确认设置正确。
使用GPTQ-for-LLaMa 4位量化运行Llama模型时,你可以使用专门为此目的设计的Docker镜像 1b5d/llm-api:latest-gpu
,作为默认镜像的替代选择。你可以使用单独的Docker Compose文件运行此模式:
docker compose -f docker-compose.gpu.yaml up
或者直接运行容器:
docker run --gpus all -v $PWD/models/:/models:rw -v $PWD/config.yaml:/llm-api/config.yaml:ro -p 8000:8000 1b5d/llm-api:latest-gpu
重要提示:llm-api:x.x.x-gptq-llama-cuda
和 llm-api:x.x.x-gptq-llama-triton
镜像已被废弃。当需要GPU支持时,请切换到 1b5d/llm-api:latest-gpu
镜像
示例配置文件:
models_dir: /models
model_family: gptq_llama
setup_params:
repo_id: user/repo_id
filename: <model.safetensors 或 model.pt>
model_params:
group_size: 128
wbits: 4
cuda_visible_devices: "0"
device: "cuda:0"
示例请求:
POST /generate
curl --location 'localhost:8000/generate' \
--header 'Content-Type: application/json' \
--data '{
"prompt": "巴黎的首都是什么",
"params": {
"temp": 0.8,
"top_p": 0.95,
"min_length": 10,
"max_length": 50
}
}'
致谢
- llama.cpp,使得在CPU上运行Llama模型成为可能。
- llama-cpp-python,为
llama.cpp
提供Python绑定库。 - GPTQ-for-LLaMa,为基于Llama的模型提供GPTQ量化实现。
- AutoAWQ,提供AWQ量化的实现。
- Huggingface,提供了出色的工具生态系统。