注意:

利用 dstack 在 Oracle Cloud Infrastructure 上优化和服务大型语言模型

简介

dstack 是一种开源工具,可简化人工智能 (Artificial Intelligence,AI) 容器编排,并使大型语言模型 (Large Language Models,LLM) 的分布式训练和部署更易于访问。结合使用 dstack 和 Oracle Cloud Infrastructure (OCI) 可以简化设置云基础设施的流程,以便进行分布式培训和可扩展的模型部署。

dstack 如何工作?

dstack 提供了一个统一的界面,可用于在任何云或数据中心开发、培训和部署 AI 模型。例如,您可以为培训任务或要部署的模型指定配置,dstack 将负责设置所需的基础结构并编排容器。dstack 的优点之一是它允许使用任何硬件、框架和脚本。

目标

先决条件

任务 1:使用 OCI 设置 dstack

  1. 使用以下命令安装 dstack Python 软件包。由于 dstack 支持多个云提供商,因此我们可以将范围缩小到 OCI。

    pip install dstack[oci]
    
  2. ~/.dstack/server/config.yml 文件中配置特定于 OCI 的身份证明。以下代码假定您配置了 OCI 命令行界面 (CLI) 的身份证明。有关其他配置选项,请参见 dstack documentation

    projects:
    - name: main
      backends:
      - type: oci
        creds:
          type: default
    
  3. 使用以下命令运行 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
    
  4. 切换到包含项目脚本的文件夹并使用以下命令初始化 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_PATHACCEL_CONFIG_PATHHUGGING_FACE_HUB_TOKENWANDB_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
# ...

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)

混合分片

使用 fsdp_configfsdp_sharding_strategydistributed_typeFSDPFULL_SHARD,模型将在一台计算机中的多个 GPU 中分片。处理多个计算节点时,每个节点将托管模型的相同副本,该模型本身会拆分为该节点中的多个 GPU。这意味着每个节点上的每个分区模型实例处理数据集的不同部分或批处理。要在跨多个节点的多个 GPU 之间分布单个模型,请将参数 fsdp_sharding_strategy 配置为 HYBRID_SHARD

其他参数(如 machine_ranknum_machinesnum_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

要点:

任务 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

此方法的主要优点:

此时,您可以使用标准 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 框架的集成使您能够无缝地优化和服务模型,确保它们针对性能进行了优化并为现实应用做好准备。我们鼓励您进一步探索可能性,并尝试不同的模型和配置,以便在自然语言处理领域实现您期望的结果。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心