生成式人工智能/大语言模型

使用 Brev.dev 和 NVIDIA NGC 目录实现一键部署 GPU 优化 AI 软件解决方案

Brev.dev 正在利用 NVIDIA NGC 目录上的软件库、框架和 Jupyter Notebooks,让开发 AI 解决方案变得更加轻松。

通过将云编排工具与简单的 UI 搭配使用,您可以使用 Brev.dev 在 NVIDIA GPU 上轻松部署软件,从任何云中可靠地获取按需 GPU,在浏览器中访问 notebook,或使用 Brev CLI 直接 SSH 到机器中。

NGC 目录是安全的 GPU 优化软件中心,包括容器、模型和 Jupyter Notebooks。该目录简化了开发和部署 AI 解决方案的流程,加快了企业的上市时间。

解决方案亮点

此集成解决了在云中启动 GPU 实例和获得集成开发环境(IDE)时通常会遇到的许多挑战,例如设置底层软件堆栈、调配正确的计算和管理 SSH 密钥。现在,只需单击一下,即可将 NGC 目录中的各种软件无缝部署到您首选的计算和 IDE 中。

此解决方案的主要特性包括:

  • 一键部署:简化 NVIDIA AI 软件的部署,不需要配额、专业知识或设置。这一手动流程通常需要数小时,现在只需 2-3 分钟即可完成。
  • 随时随地部署:Brev 的 API 可充当跨本地数据中心、公有云提供商以及混合云和私有云的统一接口,从而使您能够在任何环境中轻松部署 NVIDIA 软件。通过将云添加到 Brev,您可以消除对任何计算源的潜在锁定。
  • 简化设置流程:Brev 的开源容器工具 Verb 可靠地在任何 GPU 上安装 CUDA 和 Python,并解决依赖项问题,从而节省宝贵的时间。
  • 安全网络:借助 Brev 的 CLI 工具,您可以轻松地管理 SSH 密钥,从而安全地连接到任何计算源,而不需要处理繁琐的 IP 或 PEM 文件。

微调 Mistral Jupyter Notebook

本节通过一个专注于微调大型语言模型(LLMs)的 Jupyter Notebook 示例,探讨如何使用 NVIDIA NeMo 训练、评估和测试 Mistral 7B,以完成问答任务。

NVIDIA NeMo 是一个端到端平台,可随时随地开发自定义生成式 AI,它包含用于数据管护、训练、检索增强生成 (RAG) 和护栏的工具,为企业提供了一种简单、经济高效的方式来采用生成式 AI。

借助 Brev 的一键式部署集成,您可以快速访问 GPU 并开始使用 NeMo 自定义生成式 AI 模型。所需的软件堆栈(包括 NeMo)由 Brev 的平台设置,使您可以专注于 AI 开发,现在您可以快速利用完全 GPU 加速的堆栈,而无需担心必要的基础设施管理开销。

第 1 步:设置前提条件

首先,从 NGC 目录中获取 Notebook。在 Brev 上部署后,您可以从浏览器访问它,然后开始执行不同代码块。

选择 NGC 目录页面上的“1-click Deploy”(一键部署) 按钮。系统将指示您在 Brev 上微调 Notebook (图 1)。

Screenshot of the Mistral Jupyter Notebook page on the NGC catalog.
图 1.NGC 目录上的 Mistral Jupyter Notebook

接下来,单击“Deploy Notebook”(部署 Notebook) 按钮 (图 2)。如果您是 Brev 的新用户,系统会提示您创建帐户。在这种情况下,您需要重新单击“Deploy Notebook”(部署 Notebook) 按钮。

Screenshot of Mistral Jupyter Notebook page on Brev.
图 2.Brev 上的 Mistral Jupyter Notebook

等待实例完成设置和配置。当 JupyterLab 在NVIDIA A100 Tensor Core GPU上准备就绪时,单击“Access Notebook”。

第 2 步:准备基础模型

接下来,将 Mistral 7B 下载到您的实例中,并将其转换为 .nemo 格式。使用以下命令从 Hugging Face 中提取模型并运行转换脚本。

!pip install ipywidgets !jupyter nbextension enable --py widgetsnbextension !mkdir -p models/mistral7b
import huggingface_hub from huggingface_hub import login TOKEN = "" login(TOKEN)
huggingface_hub.snapshot_download(repo_id="mistralai/Mistral-7B-v0.1", 
local_dir="models/mistral7b", local_dir_use_symlinks=False) !python
/opt/NeMo/scripts/nlp_language_modeling/convert_hf_mistral_7b_to_nemo.py 
--in-file=models/mistral7b --out-file=models/mistral7b.nemo

此命令使用nlp_language_modeling用于将 Mistral 模型转换为 .nemo 格式的 NeMo 子目录,以便利用 NeMo 框架进行微调。

第 3 步:准备微调数据

此示例在 PubMedQA 数据集上微调了 Mistral 7B。PubMedQA 的任务是回答医学研究问题,以是/否/可能形式回答。PubMedQA 拥有 1K 专家标记、61.2K 无标记和 211.3K 人工生成的 QA 实例。

以下命令将 PubMedQA 数据转换为 .jsonl 格式,以便使用 NeMo 进行参数高效微调 (PEFT)。此外,还需要将数据重新格式化为模型可以适当处理的提示,以便模型能够正确地处理数据。

!git clone https://github.com/pubmedqa/pubmedqa.git
!cd pubmedqa/preprocess && python split_dataset.py pqal
import json

def write_jsonl(fname, json_objs):
    with open(fname, 'wt') as f:
        for o in json_objs:
            f.write(json.dumps(o)+"\n")

def form_question(obj):
    st = ""
    st += f"QUESTION:{obj['QUESTION']}\n"
    st += "CONTEXT: "
    for i, label in enumerate(obj['LABELS']):
        st += f"{obj['CONTEXTS'][i]}\n"
    st += f"TARGET: the answer to the question given the context is (yes|no|maybe): "
    return st

def convert_to_jsonl(data_path, output_path):
    data = json.load(open(data_path, 'rt'))
    json_objs = []
    for k in data.keys():
        obj = data[k]
        prompt = form_question(obj)
        completion = obj['reasoning_required_pred']
        json_objs.append({"input": prompt, "output": completion})
    write_jsonl(output_path, json_objs)
    return json_objs
test_json_objs = convert_to_jsonl("pubmedqa/data/test_set.json", "pubmedqa_test.jsonl")
train_json_objs = convert_to_jsonl("pubmedqa/data/pqal_fold0/train_set.json", "pubmedqa_train.jsonl")
dev_json_objs = convert_to_jsonl("pubmedqa/data/pqal_fold0/dev_set.json", "pubmedqa_val.jsonl")

数据现已准备就绪。已为微调任务设置训练和测试数据集。

第四步:运行训练

设置 GPU 配置、精度、最大步长等后,使用 NeMo 框架初始化训练流程。以下代码导入必要的类和模块,创建训练器实例,设置实验管理器,并加载预训练的 Megatron GPT 模型。这将合并配置,并使用所提供的训练器恢复模型。然后,该设置将运行 Mistral 的实际微调,使用 LoRA 和 PEFT。

from nemo.collections.nlp.models.language_modeling.megatron_gpt_sft_model import MegatronGPTSFTModel
from nemo.collections.nlp.parts.megatron_trainer_builder import MegatronLMPPTrainerBuilder
from nemo.collections.nlp.parts.peft_config import LoraPEFTConfig
from nemo.utils.exp_manager import exp_manager

trainer = MegatronLMPPTrainerBuilder(cfg).create_trainer()
exp_manager(trainer, cfg.exp_manager)

model_cfg = MegatronGPTSFTModel.merge_cfg_with(cfg.model.restore_from_path, cfg)
model = MegatronGPTSFTModel.restore_from(cfg.model.restore_from_path, model_cfg, trainer=trainer)

model.add_adapter(LoraPEFTConfig(model_cfg))
trainer.fit(model)

访问 GitHub 上的 NVIDIA/NeMo 框架启动程序,查看 NVIDIA NeMo 框架启动程序和工具的相关文档。

第 5 步:查看性能和结果

现在,Mistral 7B 模型已经过微调,请使用以下命令检查其相对于测试数据集的表现如何:

trainer.test(model)

trainer.test(model)行执行测试循环,该循环用于评估模型在测试数据集上的性能。输出显示测试指标(包括测试损失和 PubMedQA 数据集上的损失)以及验证损失。由于 LoRA 适配器被用于微调 Mistral,这是衡量模型在后 PEFT 中的表现的好方法。

现在,您已使用 NeMo 成功微调 Mistral 7B。

通过充当所有云的单一界面并自动设置过程,Brev 使您能够充分利用 NVIDIA 软件的强大功能,而无需离开 NVIDIA 生态系统。使用 NGC 软件的全部功能,减少约束,以增强跨任何项目规模的 AI 开发和部署的易用性。

开始使用 PyTorch 等技术

开始使用 Brev 的一键式部署,以调配 GPU 基础架构 – 前 2 小时免费:

此外,Brev 正在积极地将 1 键部署功能扩展到 NGC 目录中的更多 NVIDIA 软件上。探索 Brev.dev 的 Quick Deploy 集合

 

Tags