注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
利用 dstack 在 Oracle Cloud Infrastructure 上优化和服务大型语言模型
简介
dstack
是一种开源工具,可简化人工智能 (Artificial Intelligence,AI) 容器编排,并使大型语言模型 (Large Language Models,LLM) 的分布式训练和部署更易于访问。结合使用 dstack
和 Oracle Cloud Infrastructure (OCI) 可以简化设置云基础设施的流程,以便进行分布式培训和可扩展的模型部署。
dstack
如何工作?
dstack
提供了一个统一的界面,可用于在任何云或数据中心开发、培训和部署 AI 模型。例如,您可以为培训任务或要部署的模型指定配置,dstack
将负责设置所需的基础结构并编排容器。dstack
的优点之一是它允许使用任何硬件、框架和脚本。
目标
-
在 OCI 上使用
dstack
微调 LLM 模型,整合 Hugging Face Alignment Handbook 中的优秀实践,并使用 Hugging Face Text Generation Inference (TGI) 部署模型。注:本教程中介绍的实验使用由三个节点组成的 OCI 集群(每个集群具有 2 个 A10 GPU)来微调 Gemma 7B 模型。
先决条件
-
访问 OCI 租户。
-
使用 NVIDIA GPU 访问配置,例如 A10 GPU(例如
VM.GPU.A10.2
)。有关提高限制的请求,请参阅服务限制。 -
一个 Hugging Face 帐户,其访问令牌配置为下载 Gemma 7B 型号。
任务 1:使用 OCI 设置 dstack
-
使用以下命令安装
dstack
Python 软件包。由于dstack
支持多个云提供商,因此我们可以将范围缩小到 OCI。pip install dstack[oci]
-
在
~/.dstack/server/config.yml
文件中配置特定于 OCI 的身份证明。以下代码假定您配置了 OCI 命令行界面 (CLI) 的身份证明。有关其他配置选项,请参见 dstack documentation 。projects: - name: main backends: - type: oci creds: type: default
-
使用以下命令运行
dstack
服务器。dstack server INFO Applying ~/.dstack/server/config.yml... INFO Configured the main project in ~/.dstack/config.yml INFO The admin token is ab6e8759-9cd9-4e84-8d47-5b94ac877ebf INFO The dstack server 0.18.4 is running at http://127.0.0.1:3000
-
切换到包含项目脚本的文件夹并使用以下命令初始化
dstack
。dstack init
任务 2:使用 dstack
在 OCI 上优化作业
为了微调 Gemma 7B 模型,我们将使用 Hugging Face Alignment Handbook 来确保采用最佳微调方法。可从以下位置获取本教程的源代码:GitHub 。让我们深入了解微调 LLM 的实际步骤。
切换到项目文件夹后,使用以下命令在 OCI 上使用 dstack
启动微调作业。
ACCEL_CONFIG_PATH=fsdp_qlora_full_shard.yaml \
FT_MODEL_CONFIG_PATH=qlora_finetune_config.yaml \
HUGGING_FACE_HUB_TOKEN=xxxx \
WANDB_API_KEY=xxxx \
dstack run . -f ft.task.dstack.yml
FT_MODEL_CONFIG_PATH
、ACCEL_CONFIG_PATH
、HUGGING_FACE_HUB_TOKEN
和 WANDB_API_KEY
环境变量在 ft.task.dstack.yml
任务配置中定义。dstack run
提交在 OCI 上的 ft.task.dstack.yml
中定义的任务。
注:
dstack
在执行任务时会自动复制当前目录内容。
让我们来了解每个 YAML 文件的关键部分(有关完整内容,请检查存储库)。
qlora_finetune_config.yaml
文件是调整手册用于了解如何微调大型语言模型 (LLM) 的配方配置。
# Model arguments
model_name_or_path: google/gemma-7b
tokenizer_name_or_path: philschmid/gemma-tokenizer-chatml
torch_dtype: bfloat16
bnb_4bit_quant_storage: bfloat16
# LoRA arguments
load_in_4bit: true
use_peft: true
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
- q_proj
- k_proj
# ...
# Data training arguments
dataset_mixer:
chansung/mental_health_counseling_conversations: 1.0
dataset_splits:
- train
- test
# ...
-
模型参数:
model_name_or_path
:Google 的 Gemma 7B 被选为基本模型。tokenizer_name_or_path
:对齐手册使用所选标记器的apply_chat_template()
方法。本教程使用 ChatML 模板,而不是 Gemma 7B 的标准对话模板。torch_dtype
和bnb_4bit_quant_storage
:如果要使用 FSDP+QLoRA 微调方法,则这两个值的定义应相同。由于 Gemma 7B 很难适用于单个 A10 GPU,本教程使用 FSDP+QLoRA 将模型分片为 2 个 A10 GPU,同时利用 QLoRA 技术。
-
LoRA 参数:LoRA 特定配置。由于本教程后使用了 FSDP+QLoRA 技术,因此
load_in_4bit
设置为true
。其他配置可能因实验而异。 -
数据培训参数:我们准备了一个基于 Amod 心理健康咨询对话数据集的数据集。由于 alignment-handbook 只能以
[{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}, ...]
的形式理解数据,可以使用 tokenizer 的apply_chat_template()
方法进行解释,所以准备的数据集基本上是将原始数据集转换为apply_chat_template()
兼容格式。
fsdp_qlora_full_shard.yaml
文件配置可加速如何使用底层基础结构对 LLM 进行微调。
compute_environment: LOCAL_MACHINE
distributed_type: FSDP # Use Fully Sharded Data Parallelism
fsdp_config:
fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
fsdp_backward_prefetch: BACKWARD_PRE
fsdp_cpu_ram_efficient_loading: true
fsdp_use_orig_params: false
fsdp_offload_params: true
fsdp_sharding_strategy: FULL_SHARD
# ... (other FSDP configurations)
# ... (other configurations)
distributed_type
:FSDP
指示使用完全分片数据并行 (Fully Sharded Data Parallel,FSDP),该技术支持训练大型模型,否则这些模型不适用于单个 GPU。fsdp_config
:这些参数设置 FSDP 的运行方式,例如模型的分片方式 (fsdp_sharding_strategy
) 以及参数是否卸载到 CPU (fsdp_offload_params
)。
使用 fsdp_config
的 fsdp_sharding_strategy
的 distributed_type
的 FSDP
和 FULL_SHARD
,模型将在一台计算机中的多个 GPU 中分片。处理多个计算节点时,每个节点将托管模型的相同副本,该模型本身会拆分为该节点中的多个 GPU。这意味着每个节点上的每个分区模型实例处理数据集的不同部分或批处理。要在跨多个节点的多个 GPU 之间分布单个模型,请将参数 fsdp_sharding_strategy
配置为 HYBRID_SHARD
。
其他参数(如 machine_rank
、num_machines
和 num_processes
)对于协调非常重要。但是,建议在运行时动态设置这些值,因为这样可以在不同基础结构设置之间切换时提供灵活性。
任务 3:指示 dstack
使用简化配置预配基础结构
让我们来了解一下将所有内容放在一起的 fsdp_qlora_full_shard.yaml
配置,并指导 dstack
如何预配基础结构和运行任务。
type: task
nodes: 3
python: "3.11"
env:
- ACCEL_CONFIG_PATH
- FT_MODEL_CONFIG_PATH
- HUGGING_FACE_HUB_TOKEN
- WANDB_API_KEY
commands:
# ... (setup steps, cloning repo, installing requirements)
- ACCELERATE_LOG_LEVEL=info accelerate launch \
--config_file recipes/custom/accel_config.yaml \
--main_process_ip=$DSTACK_MASTER_NODE_IP \
--main_process_port=8008 \
--machine_rank=$DSTACK_NODE_RANK \
--num_processes=$DSTACK_GPUS_NUM \
--num_machines=$DSTACK_NODES_NUM \
scripts/run_sft.py recipes/custom/config.yaml
ports:
- 6006
resources:
gpu: 1..2
shm_size: 24GB
要点:
- 无缝集成:
dstack
与 Hugging Face 开源生态系统轻松集成。特别是,您可以简单地将加速库与我们在fsdp_qlora_full_shard.yaml
中定义的配置一起使用。 - 自动配置:
DSTACK_MASTER_NODE_IP
、DSTACK_NODE_RANK
、DSTACK_GPUS_NUM
和DSTACK_NODES_NUM
变量由dstack
自动管理,从而减少手动设置。 - 资源分配:通过
dstack
,可以轻松地为微调作业指定节点和 GPU 数 (gpu:1..2)。因此,对于本教程,有三个节点,每个节点都配备有 2 个 A10(24GB) GPU。
任务 4:使用 dstack
为您的微调模型提供服务
在对模型进行微调后,dstack
可以轻而易举地使用 Hugging Face Text Generation Inference (TGI) 框架在 OCI 上部署模型。
下面是如何在 dstack
中定义服务的示例:
type: service
image: ghcr.io/huggingface/text-generation-inference:latest
env:
- HUGGING_FACE_HUB_TOKEN
- MODEL_ID=chansung/mental_health_counseling_merged_v0.1
commands:
- text-generation-launcher \
--max-input-tokens 512 --max-total-tokens 1024 \
--max-batch-prefill-tokens 512 --port 8000
port: 8000
resources:
gpu:
memory: 48GB
# (Optional) Enable the OpenAI-compatible endpoint
model:
format: tgi
type: chat
name: chansung/mental_health_counseling_merged_v0.1
此方法的主要优点:
- 安全 HTTPS 网关:
dstack
可简化通过网关(生产级模型服务的一个关键方面)设置安全 HTTPS 连接的过程。 - 针对推理进行了优化: TGI 框架专为高效的文本生成推理而设计,可确保模型提供响应迅速且可靠的结果。
- 自动缩放:
dstack
允许指定自动缩放策略,包括模型副本的最小数量和最大数量。
此时,您可以使用标准 curl
命令和 Python 请求、OpenAI SDK 和 Hugging Face 的推断客户机库与服务进行交互。例如,以下代码片段显示了 curl 的示例。
curl -X POST https://black-octopus-1.mycustomdomain.com/generate \
-H "Authorization: Bearer <dstack-token>" \
-H 'Content-Type: application/json' \
-d '{"inputs": "I feel bad...", "parameters": {"max_new_tokens": 128}}'
此外,对于已部署的模型,dstack
会自动提供一个用户界面来直接与模型交互。
后续步骤
通过遵循本教程中概述的步骤,您已经解锁了使用 dstack
、OCI 和 Hugging Face 生态系统的组合功能来微调和部署 LLM 的强大方法。现在,您可以利用 dstack
用户友好的界面有效地管理 OCI 资源,从而简化为 LLM 项目设置分布式培训环境的流程。
此外,与 Hugging Face 的 Alignment Handbook 和 TGI 框架的集成使您能够无缝地优化和服务模型,确保它们针对性能进行了优化并为现实应用做好准备。我们鼓励您进一步探索可能性,并尝试不同的模型和配置,以便在自然语言处理领域实现您期望的结果。
确认
- 作者 — Chansung Park(HuggingFace 人工智能研究员)、Yann Caniou(AI Infra/GPU 专家)、Bruno Garbaccio(AI Infra/GPU 专家)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Fine-Tune and Serve Large Language Models on Oracle Cloud Infrastructure with dstack
G11981-01
July 2024