搭建Alpaca-LoRa

本文以搭建Alpaca-LoRa为例,演示如何使用数据缓存。通过数据缓存提前拉取llama-7b-hf模型数据和alpaca-lora-7b权重数据,然后在创建Alpaca-LoRa应用实例时直接挂载模型和权重数据,可以免去在实例中拉取数据的等待时间,加速Apache-LoRa启动过程。

背景信息

Alpaca-LoRa是一种使用Lora技术在LLaMA模型进行微调的轻量级语言模型。它可以模拟自然语言进行对话交互,根据用户输入的指令来生成不同的文本,协助用户完成写作、翻译、编写代码等任务。

重要
  • 阿里云不对第三方模型的合法性、安全性、准确性进行任何保证,阿里云不对由此引发的任何损害承担责任。

  • 您应自觉遵守第三方模型的用户协议、使用规范和相关法律法规,并就使用第三方模型的合法性、合规性自行承担相关责任。

前提条件

您使用的VPC已绑定公网NAT网关,并配置SNAT条目允许该VPC或下属交换机的资源可以访问公网。

说明

如果VPC没有绑定公网NAT网关,您需要在创建数据缓存和部署应用时绑定EIP,以便可以拉取公网数据。

操作步骤

制作Alpaca-LoRa镜像

请根据自身业务需求,参考以下步骤制作镜像。

  1. 访问alpaca-lora,将仓库克隆到本地。

  2. 修改仓库中的requirements.txt和Dockerfile。

    展开查看requirements.txt

    accelerate
    appdirs
    loralib
    bitsandbytes
    black
    black[jupyter]
    datasets
    fire
    git+https://github.com/huggingface/peft.git
    transformers>=4.28.0
    sentencepiece
    gradio
    scipy

    展开查看Dockerfile

    FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update && apt-get install -y \
        git \
        curl \
        software-properties-common \
        && add-apt-repository ppa:deadsnakes/ppa \
        && apt install -y python3.10 \
        && rm -rf /var/lib/apt/lists/*
    WORKDIR /workspace
    COPY requirements.txt requirements.txt
    RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 \
        && python3.10 -m pip install -r requirements.txt \
        && python3.10 -m pip install numpy --pre torch --force-reinstall --index-url https://download.pytorch.org/whl/nightly/cu118 \
        && python3.10 -m pip install --upgrade typing-extensions
    COPY . .
    
    EXPOSE 7860
  3. 使用Dockerfile构建镜像。

  4. 将镜像推送到镜像仓库中。

创建数据缓存

  1. 访问HuggingFace,获取模型ID。

    本文使用以下两个模型,在HuggingFace找到目标模型后,在模型详情页面顶部可以复制模型ID。

    • decapoda-research/llama-7b-hf

    • tloen/alpaca-lora-7b

  2. 创建数据缓存。

    说明

    如果您的业务部署在中国内地地域,建议您在中国香港地域创建数据缓存,然后拷贝数据缓存到您需要的地域。

    1. 创建llama-7b-hf的数据缓存。

      调用CreateDataCache接口创建数据缓存所采用的参数示例如下,表示从HuggingFace拉取llama-7b-hf模型数据,保存到名为test的Bucket的/model/llama-7b-hf目录。数据缓存名为llama-7b-hf,保留时长为1天。

      重要

      如果您通过SDK创建数据缓存,DataSource.Options中的各个参数前无需添加参数名的长度,例如#10#repoSource直接写成repoSource#6#repoId直接写成repoId即可。

      {
        "RegionId": "cn-beijing",
        "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
        "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
        "Bucket": "test",
        "Path": "/model/llama-7b-hf",
        "Name": "llama-7b-hf",
        "DataSource": {
          "Type": "URL",
          "Options": {
            "#10#repoSource": "HuggingFace/Model",
            "#6#repoId": "decapoda-research/llama-7b-hf"
          }
        },
        "RetentionDays": 1
      }
    2. 创建alpaca-lora-7b的数据缓存。

      调用CreateDataCache接口创建数据缓存所采用的参数示例如下,表示从HuggingFace拉取alpaca-lora-7b模型数据,保存到名为test的Bucket的/model/alpaca-lora-7b目录。数据缓存名为alpaca-lora-7b,保留时长为1天。

      重要

      如果您通过SDK创建数据缓存,DataSource.Options中的各个参数前无需添加参数名的长度,例如#10#repoSource直接写成repoSource#6#repoId直接写成repoId即可。

      {
        "RegionId": "cn-beijing",
        "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
        "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
        "Bucket": "test",
        "Path": "/model/alpaca-lora-7b",
        "Name": "alpaca-lora-7b",
        "DataSource": {
          "Type": "URL",
          "Options": {
            "#10#repoSource": "HuggingFace/Model",
            "#6#repoId": "tloen/alpaca-lora-7b"
          }
        },
        "RetentionDays": 1
      }
  3. 查询数据缓存状态。

    根据返回的数据缓存ID调用DescribeDataCaches接口查询数据缓存信息,当数据缓存的状态(DataCaches.Status)为Available时,表示可以使用该数据缓存。

部署Alpaca-lora应用

  1. 使用数据缓存创建ECI实例,部署Alpaca-lora应用。

    调用CreateContainerGroup接口创建ECI实例所采用的参数示例如下,该ECI实例增加了20 GiB的临时存储空间,并挂载了llama-7b-hf和alpaca-lora-7b模型数据。实例内的容器使用准备好的Alpaca-lora镜像,模型数据在容器内的挂载路径分别为/data/llama-7b-hf/data/alpaca-lora-7b,容器启动后会运行python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b

    {
      "RegionId": "cn-beijing",
      "SecurityGroupId": "sg-2ze63v3jtm8e6syi****",
      "VSwitchId": "vsw-2ze94pjtfuj9vaymf****",
      "ContainerGroupName": "alpacalora",
      "DataCacheBucket": "test",
      "EphemeralStorage": 20,
      "Container": [
        {
          "Name": "alpacalora",
          "Image": "registry-vpc.cn-beijing.aliyuncs.com/******/***-registry:v1.0",
          "Command": [
            "/bin/sh",
            "-c"
          ],
          "Arg": [
            "python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b"
          ],
          "Cpu": 16,
          "Memory": 64,
          "Port": [
            {
              "Port": 7860,
              "Protocol": "TCP"
            }
          ],
          "VolumeMount": [
            {
              "Name": "llama-model",
              "MountPath": "/data/llama-7b-hf"
            },
            {
              "MountPath": "/data/alpaca-lora-7b",
              "Name": "alpacalora-weight"
            }
          ]
        }
      ],
      "Volume": [
        {
          "Type": "HostPathVolume",
          "HostPathVolume.Path": "/model/llama-7b-hf",
          "Name": "llama-model"
        },
        {
          "Type": "HostPathVolume",
          "HostPathVolume.Path": "/model/alpaca-lora-7b",
          "Name": "alpacalora-weight"
        }
      ]
    }

  2. 确认应用部署状态。

    根据返回的实例ID调用DescribeContainerGroupStatus查询实例和容器状态。当实例状态(Status)和容器状态(ContainerStatuses.State)为Running,表示实例已经创建成功,容器正在运行。

  3. 对外开放应用。

    在ECI实例所属VPC已绑定NAT网关的前提下,您需要创建DNAT条目,使得ECI实例可以对外提供公网访问服务。具体操作,请参见创建和管理DNAT条目

    说明

    如果VPC没有绑定NAT网关,则需要您在创建ECI实例时为其绑定一个EIP,此时可以跳过本步骤。

    创建DNAT条目采用的配置项示例如下:

    • 公网IP地址:选择NAT网关绑定的EIP地址。

    • 私网IP地址:选择部署了Alpaca-lora应用的ECI实例。

    • 端口设置:使用具体端口,公网端口配置为80,私网端口配置为7860,协议为TCP。

测试模型效果

  1. 在ECI实例所属安全组中添加入方向规则,开放应用对外端口。

  2. 打开浏览器,访问Alpaca-lora应用。

    在配置了DNAT的情况下,请输入DNAT条目中配置的公网IP地址和公网端口,例如47.94.XX.XX:80

    说明

    如果ECI实例单独绑定了EIP,请输入EIP地址和容器开放的端口,例如47.94.XX.XX:7860

  3. 输入文本,测试模型。

    示例如下:

    lora-api.png