搭建Alpaca-LoRa

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

背景信息

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

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

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

前提条件

  • 集群中已部署DataCache CRD。具体操作,请参见部署DataCache CRD

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

    说明

    如果VPC没有绑定公网NAT网关,您需要在创建DataCache和部署应用时绑定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. 将镜像推送到镜像仓库中。

创建DataCache

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

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

    • decapoda-research/llama-7b-hf

    • tloen/alpaca-lora-7b

  2. 创建DataCache。

    1. 创建llama-7b-hf的DataCache。

      kubectl apply -f llama-7b-hf.yaml

      llama-7b-hf.yaml的内容如下:

      apiVersion: eci.aliyun.com/v1alpha1
      kind: DataCache
      metadata:
        name: llama-7b-hf
      spec:
        path: /model/llama-7b-hf                          # 设置模型数据的存储路径
        bucket: test                                      # 指定DataCache Bucket
        dataSource:
          type: URL 
          options:
            repoSource: "HuggingFace/Model"               # 指定数据源为HuggingFace的模型
            repoId: "decapoda-research/llama-7b-hf"       # 指定模型ID
        netConfig: 
          securityGroupId: sg-2ze63v3jtm8e6sy******
          vSwitchId: vsw-2ze94pjtfuj9vaym******           # 指定已配置SNAT的交换机
    2. 创建alpaca-lora-7b的DataCache。

      kubectl apply -f alpaca-lora-7b.yaml

      alpaca-lora-7b.yaml的内容如下:

      apiVersion: eci.aliyun.com/v1alpha1
      kind: DataCache
      metadata:
        name: alpaca-lora-7b
      spec:
        path: /model/alpaca-lora-7b                        # 设置模型数据的存储路径
        bucket: test                                       # 指定DataCache Bucket
        dataSource:
          type: URL 
          options:
            repoSource: "HuggingFace/Model"               # 指定数据源为HuggingFace的模型
            repoId: "tloen/alpaca-lora-7b"                # 指定模型ID
        netConfig: 
          securityGroupId: sg-2ze63v3jtm8e6sy******
          vSwitchId: vsw-2ze94pjtfuj9vaym******           # 指定已配置SNAT的交换机
  3. 查询DataCache状态。

    kubectl get edc

    当数据下载完成,DataCache的状态为Available时,表示可以使用DataCache。示例如下:

    lora1.png

部署Alpaca-lora应用

  1. 编写应用的YAML配置文件,然后使用该YAML文件部署Alpaca-lora应用。

    kubectl create -f alpacalora.yaml

    alpacalora.yaml的内容示例如下,可以创建两个资源对象:

    • Deployment:名称为alpacalora,包含一个Pod副本。Pod增加了20 GiB的临时存储空间,并挂载了llama-7b-hf和alpaca-lora-7b缓存数据。Pod内容器使用的镜像为您制作好的Alpaca-LoRa镜像,容器启动后会运行python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b

    • Service:名称为alpacalora-svc,类型为LoadBalancer,对外公开80端口,可以将流量转发到带有app: alpacalora的Label的Pod的7860端口。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: alpacalora
      labels:
        app: alpacalora
    spec:
      replicas: 1 
      selector:
        matchLabels:
          app: alpacalora
      template:
        metadata:
          labels:
            app: alpacalora
          annotations:
            k8s.aliyun.com/eci-data-cache-bucket: "test"              # 指定DataCache Bucket
            k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi"        # 增加临时存储空间
        spec:
          containers:
          - name: alpacalora
            image: registry.cn-hangzhou.aliyuncs.com/****/alpaca-lora:v3.5   # 使用您制作好的镜像
            command: ["/bin/sh","-c"]
            args: ["python3.10 generate.py --load_8bit --base_model /data/llama-7b-hf --lora_weights /data/alpaca-lora-7b"] # 按需替换启动命令参数
            resources:
              limits:
                cpu: "16000m"
                memory: "64.0Gi"
            ports:
            - containerPort: 7860
            volumeMounts:
            - mountPath: /data/llama-7b-hf         # llama-7b-hf在容器内的挂载路径
              name: llama-model
            - mountPath: /data/alpaca-lora-7b   # alpaca-lora-7b在容器内的挂载路径
              name: alpacalora-weight
          volumes:
            - name: llama-model
              hostPath:
                path: /model/llama-7b-hf       # llama-7b-hf的存储路径
            - name: alpacalora-weight
              hostPath:
                path: /model/alpaca-lora-7b   # alpaca-lora-7b的存储路径
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: alpacalora-svc
    spec:
      ports:
      - port: 80
        targetPort: 7860
        protocol: TCP
      selector:
        app: alpacalora
      type: LoadBalancer
  2. 确认应用部署状态。

    kubectl get deployment alpacalora
    kubectl get Pod

    示例如下,可以看到Alpaca-lora应用已经部署成功。

    lora2.png
  3. 查看Service地址。

    kubectl get svc alpacalora-svc 

    返回示例如下,Service对外地址(EXTERNAL-IP)为123.57.XX.XX。

    lora3.png

测试模型效果

  1. 在Pod所属安全组中添加入方向规则,开放80端口。

  2. 打开浏览器,访问Service对外地址的80端口。

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

    示例如下:

    lora4.png