本仓库包含用于训练、微调、评估和部署 LLM 进行推理的代码,基于 Composer 和 MosaicML 平台。该代码库设计为易用、高效且灵活,支持快速试验最新技术。
本仓库包含以下内容:
* llmfoundry/ - 模型、数据集、回调函数、工具等的源代码
* scripts/ - 运行 LLM 工作负载的脚本
* data_prep/ - 将原始文本数据转换为 StreamingDataset 格式
* train/ - 训练或微调 125M 至 70B 参数的 HuggingFace 和 MPT 模型
* train/benchmarking - 测量训练吞吐量和 MFU
* inference/ - 将模型转换为 HuggingFace 或 ONNX 格式,并生成回复
* inference/benchmarking - 测量推理延迟和吞吐量
* eval/ - 在学术(或自定义)上下文学习任务上评估 LLM
* mcli/ - 使用 MCLI 和 MosaicML 平台 启动这些工作负载
* TUTORIAL.md - 更深入的仓库指南、示例工作流和常见问题解答
DBRX 是由 Databricks Mosaic 团队训练的最先进的开源 LLM。它采用混合专家(MoE)架构,并使用优化版本的 Composer、LLM Foundry 和 MegaBlocks 进行训练。该模型共有 132B 参数,其中 36B 为活跃参数。我们发布了两个 DBRX 模型:
| 模型 | 上下文长度 | 下载地址 |
|---|---|---|
| DBRX Base | 32768 | https://huggingface.co/databricks/dbrx-base |
| DBRX Instruct | 32768 | https://huggingface.co/databricks/dbrx-instruct |
我们的模型权重和代码对研究人员和商业实体均开放许可。Databricks 开源许可可在 LICENSE 中找到,可接受使用政策可在此处查看。
有关 DBRX 模型的更多信息,请参阅 https://github.com/databricks/dbrx。
Mosaic 预训练 Transformer(MPT)是 GPT 风格的模型,具有一些特殊功能——Flash Attention 提高效率,ALiBi 实现上下文长度外推,以及稳定性改进以减少损失尖峰。作为 MosaicML 基础系列的一部分,我们开源了多个 MPT 模型:
| 模型 | 上下文长度 | 下载地址 | 是否可商用? |
|---|---|---|---|
| MPT-30B | 8192 | https://huggingface.co/mosaicml/mpt-30b | 是 |
| MPT-30B-Instruct | 8192 | https://huggingface.co/mosaicml/mpt-30b-instruct | 是 |
| MPT-30B-Chat | 8192 | https://huggingface.co/mosaicml/mpt-30b-chat | 否 |
| MPT-7b-8k | 8192 | https://huggingface.co/mosaicml/mpt-7b-8k | 是 |
| MPT-7b-8k-Chat | 8192 | https://huggingface.co/mosaicml/mpt-7b-8k-chat | 否 |
| MPT-7B | 2048 | https://huggingface.co/mosaicml/mpt-7b | 是 |
| MPT-7B-Instruct | 2048 | https://huggingface.co/mosaicml/mpt-7b-instruct | 是 |
| MPT-7B-Chat | 2048 | https://huggingface.co/mosaicml/mpt-7b-chat | 否 |
| MPT-7B-StoryWriter | 65536 | https://huggingface.co/mosaicml/mpt-7b-storywriter | 是 |
要在本地试用这些模型,请按照 scripts/inference/README.md 中的说明,使用 hf_generate.py 或 hf_chat.py 脚本提示 HF 模型。
社区为 MPT 所做的出色工作让我们深受感动!这里我们提供一些相关链接:
* ReplitLM:replit-code-v1-3b 是一个专注于代码补全的 2.7B 因果语言模型,在涵盖 Java、Python 和 C++ 等 20 种语言的 Stack Dedup v1.2 数据集子集上训练。
* LLaVa-MPT:通过视觉指令微调使 MPT 获得多模态能力。
* ggml:优化的 MPT 版本,可在消费级硬件上进行高效推理。
* GPT4All:本地运行的聊天系统,现已支持 MPT!
* Q8MPT-Chat:由 Intel 朋友提供的用于 CPU 的 8 位优化 MPT。
来自社区的教程视频:
* 使用 Langchain 的 MPT-7B 作者:@jamesbriggs
* MPT-7B StoryWriter 介绍 作者:AItrepreneur
* 在单个 GPU 上微调 MPT-7B 作者:@AIology2022
* 如何在 Google Colab 上微调 MPT-7B-Instruct 作者:@VRSEN
缺少什么?欢迎通过 PR 贡献!
该代码库已在 PyTorch 2.4 上使用 NVIDIA A100 和 H100 进行了测试。该代码库也可能适用于其他设备(如消费级 NVIDIA 显卡和 AMD 显卡)的系统,但我们不积极测试这些系统。如果您在其他系统上成功/失败地使用了 LLM Foundry,请通过 Github issue 告知我们,我们将更新支持矩阵!
| 设备 | Torch 版本 | Cuda 版本 | 状态 |
|---|---|---|---|
| A100-40GB/80GB | 2.7.0 | 12.8 | :white_check_mark: 支持 |
| H100-80GB | 2.7.0 | 12.8 | :white_check_mark: 支持 |
我们强烈建议使用我们预构建的 Docker 镜像。您可以在此处找到它们:https://hub.docker.com/orgs/mosaicml/repositories。
mosaicml/pytorch 镜像固定到特定的 PyTorch 和 CUDA 版本,稳定且很少更新。
mosaicml/llm-foundry 镜像在每次提交到 main 分支时都会构建新标签。
您可以选择特定的提交哈希,例如 mosaicml/llm-foundry:2.7.0_cu128-9867a7b,或使用最新的 mosaicml/llm-foundry:2.7.0_cu128-latest。
请注意: mosaicml/llm-foundry 镜像未预装 llm-foundry 包,仅预装了依赖项。您仍然需要从 PyPi 或源码 pip install llm-foundry。
| Docker 镜像 | Torch 版本 | Cuda 版本 | 是否安装了 LLM Foundry 依赖项? |
|---|---|---|---|
mosaicml/pytorch:2.7.0_cu128-python3.12-ubuntu22.04 |
2.7.0 | 12.8 (Infiniband) | 否 |
mosaicml/llm-foundry:2.7.0_cu128-latest |
2.7.0 | 12.8 (Infiniband) | 是 |
mosaicml/llm-foundry:2.7.0_cu128_aws-latest |
2.7.0 | 12.8 (EFA) | 是 |
假设您已经安装了 PyTorch、CMake 和 packaging。如果没有,可以使用 pip install cmake packaging torch 安装它们。
首先,克隆仓库并设置环境。具体步骤因是否使用 Docker 而异。
我们强烈建议在 Docker 容器内使用 LLM Foundry(请参阅上面推荐的 Docker 镜像)。如果您使用 Docker,请按照以下步骤克隆仓库并安装依赖项。
git clone https://github.com/mosaicml/llm-foundry.git
cd llm-foundry
pip install -e ".[gpu]" # 如果没有 NVIDIA GPU,则使用 `pip install -e .`
如果您选择不使用 Docker,应创建并使用虚拟环境。
git clone https://github.com/mosaicml/llm-foundry.git
cd llm-foundry
# 创建并激活虚拟环境
python3 -m venv llmfoundry-venv
source llmfoundry-venv/bin/activate
pip install cmake packaging torch # setup.py 需要先安装这些
pip install -e ".[gpu]" # 如果没有 NVIDIA GPU,则使用 `pip install -e .`
NVIDIA H100 GPU 支持 FP8;我们已在上面的 Docker 镜像中安装了 Flash Attention 和 Transformer。如果您没有使用我们的 Docker 镜像,可以使用以下命令安装这些包:
pip install flash-attn --no-build-isolation
pip install git+https://github.com/NVIDIA/TransformerEngine.git@stable
有关启用 TransformerEngine 层和 amp_fp8 的更多详细信息,请参见此处。
在我们对 AMD GPU 的测试中,环境设置包括:
git clone https://github.com/mosaicml/llm-foundry.git
cd llm-foundry
# 创建并激活虚拟环境
python3 -m venv llmfoundry-venv-amd
source llmfoundry-venv-amd/bin/activate
# 安装
pip install cmake packaging torch
pip install -e . # 这会安装一些不需要的东西,但不会造成损害
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2
最后,安装支持 ROCm 的 flash attention(说明在此处)。
注意:
1. 我们目前还没有一个所有东西都能完美运行的 Docker 镜像。您可能需要升级/降级某些包(在我们的案例中,我们需要将 numpy==1.23.5 降级)才能使一切正常工作。
LLM Foundry 在 Intel Gaudi 设备上的支持是实验性的,请使用 habana_alpha 分支,并参阅该分支上的 README,其中包含安装说明和已知问题。
有关 Intel Gaudi2 加速器的训练和推理性能结果,请参阅我们的博客:https://www.databricks.com/blog/llm-training-and-inference-intel-gaudi2-ai-accelerators
注意
在尝试快速入门之前,请确保已完成上述安装步骤!
以下是一个端到端的工作流:准备 C4 数据集的一个子集,训练一个 MPT-125M 模型 10 个批次,将模型转换为 HuggingFace 格式,在 Winograd 挑战上评估模型,并生成提示的回复。
(请记住,这只是一个快速入门演示工具——要获得良好质量,LLM 需要训练超过 10 个批次 😄)
cd scripts
# 将 C4 数据集转换为 StreamingDataset 格式
python data_prep/convert_dataset_hf.py \
--dataset allenai/c4 --data_subset en \
--out_root my-copy-c4 --splits train_small val_small \
--concat_tokens 2048 --tokenizer EleutherAI/gpt-neox-20b --eos_text '<|endoftext|>'
# 训练一个 MPT-125m 模型 10 个批次
composer train/train.py \
train/yamls/pretrain/mpt-125m.yaml \
variables.data_local=my-copy-c4 \
train_loader.dataset.split=train_small \
eval_loader.dataset.split=val_small \
max_duration=10ba \
eval_interval=0 \
save_folder=mpt-125m
# 将模型转换为 HuggingFace 格式
python inference/convert_composer_to_hf.py \
--composer_path mpt-125m/ep0-ba10-rank0.pt \
--hf_output_path mpt-125m-hf \
--output_precision bf16 \
# --hf_repo_for_upload user-org/repo-name
# 在任务子集上评估模型
composer eval/eval.py \
eval/yamls/hf_eval.yaml \
icl_tasks=eval/yamls/copa.yaml \
model_name_or_path=mpt-125m-hf
# 生成提示的回复
python inference/hf_generate.py \
--name_or_path mpt-125m-hf \
--max_new_tokens 256 \
--prompts \
"The answer to life, the universe, and happiness is" \
"Here's a quick recipe for baking chocolate chip cookies: Start by"
注意:上面用于训练模型的 composer 命令指的是 Composer 库的分布式启动器。
如果您拥有具有写入权限的 HuggingFace 认证令牌,您可以选择将模型上传到 Hub!只需像这样导出您的令牌:
export HF_TOKEN=your-auth-token
并在上述调用 inference/convert_composer_to_hf.py 的取消注释包含 --hf_repo_for_upload ... 的行。
您可以使用注册表来自定义工作流,而无需 fork 库。LLM Foundry 的某些组件是可注册的,例如模型、日志记录器和回调函数。这意味着您可以为这些组件注册新选项,然后在 yaml 配置中使用它们。
为了帮助查找和理解可注册的组件,您可以使用 llmfoundry registry cli 命令。
我们目前提供两个命令:
- llmfoundry registry get [--group]:列出所有注册表及其组件,可以选择指定特定的注册表。示例用法:llmfoundry registry get --group loggers 或 llmfoundry registry get
- llmfoundry registry find <group> <name>:获取有关特定已注册组件的信息。示例用法:llmfoundry registry find loggers wandb
在这些命令上使用 --help 以获取更多信息。
这些命令还可以帮助您理解每个注册表的组成,因为每个注册表都包含一个将被打印出来的 docstring。一般概念是,每个注册表定义一个接口,注册到该注册表的组件必须实现该接口。如果库中有您认为应该可扩展但尚未实现的部分,请提交 issue!
有几种方法可以注册新组件:
如果您正在构建自己的包并包含注册的组件,则可以通过 Python entrypoint 指定注册的组件。如果您要构建一个大型 LLM Foundry 扩展,并覆盖许多组件,这将是预期的用法。请注意,通过 entrypoints 注册的内容将覆盖直接通过代码注册的内容。
例如,以下将 MyLogger 类以键 my_logger 注册到 llm_foundry.loggers 注册表中:
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "foundry_registry"
version = "0.1.0"
dependencies = [
"mosaicml",
"llm-foundry",
]
# 注意:虽然在 Python 代码中,这是 llmfoundry.registry.loggers,
# 但在 entry_points 中指定时,必须使用 "llmfoundry_loggers"。也就是说,
# 名称的各个段应在 entry_points 部分中用 _ 连接。
[project.entry-points."llmfoundry_loggers"]
my_logger = "foundry_registry.loggers:MyLogger"
如果通过 entrypoints 开发新组件,需要注意的是 Python entrypoints 是全局的。这意味着如果您有多个包注册了具有相同键的组件,则最后安装的包将被使用。这对于覆盖 LLM Foundry 中的组件很有用,但如果不小心,也可能导致意外行为。此外,如果更改了 pyproject.toml,您需要重新安装包才能使更改生效。您可以通过 pip install -e . --no-deps 快速完成此操作,以避免重新安装依赖项。
您还可以直接在代码中注册组件:
from composer.loggers import LoggerDestination
from llmfoundry.registry import loggers
class MyLogger(LoggerDestination):
pass
loggers.register("my_logger", func=MyLogger)
您还可以使用装饰器直接从代码中注册组件:
from composer.loggers import LoggerDestination
from llmfoundry.registry import loggers
@loggers.register("my_logger")
class MyLogger(LoggerDestination):
pass
对于直接调用和装饰器方法,如果您使用 LLM Foundry 的训练/评估脚本,则需要提供 code_paths 参数,这是一个需要执行以注册组件的文件列表。例如,您可能有一个名为 foundry_imports.py 的文件,其中包含以下内容:
from foundry_registry.loggers import MyLogger
from llmfoundry.registry import loggers
loggers.register("my_logger", func=MyLogger)
然后,在 yaml 配置中为训练/评估脚本提供 code_paths:
...
code_paths:
- foundry_imports.py
...
如果您要构建一个小型 LLM Foundry 扩展,仅覆盖少数组件,因此不想创建整个包,则预计将使用其中一种方法。
查看 TUTORIAL.md 以继续学习如何使用 LLM Foundry。本教程突出显示了示例工作流,为您指向仓库中的其他资源,并回答了常见问题!
如果您在代码中遇到任何问题,请直接在此仓库提交 Github issue。
如果您想在 MosaicML 平台上训练 LLM,请通过 demo@mosaicml.com 联系我们!