Todos os produtos
Search
Central de documentação

Auto Scaling:Use spot instances to save costs on large model fine-tuning

Última atualização: Jul 20, 2026

Um grupo de dimensionamento provisiona automaticamente instâncias spot para o ajuste fino de modelos grandes e garante a continuidade do treinamento. Para isso, cria uma nova instância e retoma o processo a partir do checkpoint mais recente sempre que uma instância spot estiver sujeita a interrupção e recuperação.

Visão geral da solução

Esta solução adota uma estratégia prioritária para instâncias spot por meio de um grupo de dimensionamento e utiliza o Object Storage Service (OSS) para persistir checkpoints. Durante o treinamento:

  1. Priorização de instâncias spot: O grupo de dimensionamento prioriza instâncias spot para tarefas de treinamento e usa o OSS para armazenar arquivos de checkpoint.

  2. Interrupção e recuperação de instância spot: Quando uma instância spot é interrompida e recuperada, o grupo de dimensionamento tenta primeiro provisionar uma nova instância spot no inventário disponível de outras zonas de disponibilidade. Se o inventário spot for insuficiente, ele provisiona automaticamente uma instância de pagamento conforme o uso e retoma o treinamento a partir do checkpoint mais recente.

  3. Restauração do inventário spot: Após a restauração do inventário spot, o grupo de dimensionamento substitui automaticamente a instância de pagamento conforme o uso por uma instância spot e retoma o treinamento a partir do checkpoint mais recente.

image

Nota

Se o custo for sua principal preocupação e você puder tolerar tempos de treinamento mais longos, configure o grupo de dimensionamento para usar apenas instâncias spot. Nessa configuração, o treinamento pausa quando as instâncias spot ficam indisponíveis e retoma automaticamente quando o inventário é restaurado, maximizando sua economia. Saiba mais sobre como combinar grupos de dimensionamento e instâncias spot.

Comparação de custos

Importante

A comparação de custos a seguir serve apenas como referência. A economia real pode variar dependendo das condições de execução.

Considere um tempo total de treinamento de 12 horas, preço de instância spot de 3,5/hora e preço de instância de pagamento conforme o uso de 10/hora. A comparação de custos é a seguinte:

Modo

Apenas instâncias spot

Híbrido (spot e pagamento conforme o uso)

Apenas pagamento conforme o uso

Descrição

Quando uma instância spot é interrompida e recuperada, o treinamento pausa. Uma nova instância spot inicia automaticamente para continuar o treinamento após a restauração da capacidade.

Considere que, das 12 horas totais de treinamento, 8 horas ocorrem em instâncias spot e 4 horas em instâncias de pagamento conforme o uso devido a interrupções.

Todo o treinamento ocorre em instâncias de pagamento conforme o uso.

Custo

12h * 3,5/h = 42

8h 3,5/h + 4h 10/h = 68

12h * 10/h = 120

Economia em relação a apenas pagamento conforme o uso

65%

43,33%

0%

Procedimento

  1. Crie uma imagem personalizada com o ambiente base de treinamento.

    Essa imagem serve como imagem de inicialização para as instâncias no grupo de dimensionamento. Ela inclui um script de inicialização que retoma o treinamento automaticamente, garantindo que novas instâncias iniciem a tarefa e executem sem intervenção manual.

  2. Crie e configure um grupo de dimensionamento.

    O grupo de dimensionamento cria automaticamente novas instâncias spot ou de pagamento conforme o uso após uma interrupção, assegurando a continuidade da tarefa de treinamento.

  3. Inicie a tarefa de treinamento.

    Ativar o grupo de dimensionamento aciona um evento de scale-out, criando uma instância que inicia automaticamente a tarefa de treinamento.

  4. Simule uma interrupção (verificação).

    Libere manualmente uma instância para simular um cenário de interrupção ou recuperação. Verifique se uma nova instância inicia e se a tarefa de treinamento retoma automaticamente para garantir estabilidade e confiabilidade.

1. Crie uma imagem de treinamento personalizada

Este tópico demonstra como realizar o ajuste fino de autoconhecimento no modelo DeepSeek-R1-Distill-Qwen-7B usando o framework de treinamento Swift em uma configuração de máquina única com GPU única.

Primeiro, crie uma instância com o ambiente de treinamento e as dependências necessários e, em seguida, gere uma imagem personalizada a partir dela para servir como imagem de inicialização do grupo de dimensionamento. A imagem inclui um script de treinamento automático e um service de inicialização para automatizar o fluxo de trabalho. A figura a seguir mostra a arquitetura.

image

Os principais componentes incluem:

  • Dependências do ambiente base de treinamento: Inclui o driver da GPU, CUDA e dependências Python relevantes, que variam conforme o framework de treinamento.

  • Script de treinamento automático: Este script deve verificar automaticamente se é necessário retomar a partir do checkpoint mais recente e se o treinamento foi concluído.

  • Montagem automática do bucket na inicialização: Ao iniciar, o script de treinamento lê os pesos do modelo, conjuntos de dados e arquivos de checkpoint gerados diretamente do bucket do OSS.

  • Service de inicialização: Garante que o script de treinamento seja executado automaticamente após a instância ser iniciada, lendo os arquivos necessários do bucket para começar ou continuar o treinamento.

Siga estas etapas para criar a imagem.

1,1 Crie uma instância e prepare o ambiente

Esta instância servirá como modelo para a criação da imagem personalizada. Posteriormente, o grupo de dimensionamento usará essa imagem para criar novas instâncias automaticamente.

  1. Acesse o ECS console para criar uma instância GPU.

    Primeiro, crie uma instância GPU de pagamento conforme o uso para configurar o ambiente base. Este tutorial utiliza uma instância ecs.gn7i-c8g1.2xlarge na Zona de Disponibilidade J da região China (Hangzhou). Configure a instância da seguinte forma:

    1. Billing Method: Pay-As-You-Go.

    ②:Region. China (Hangzhou).

    ③④: Network and Zone. Selecione uma VPC e um vSwitch. Se não existirem, crie-os seguindo as instruções na tela.

    ⑤⑥: Select instance type. Selecione ecs.gn7i-c8g1.2xlarge.

    ⑦⑧⑨: Images: Ubuntu 22.04 64-bit.

    ⑩: Auto-install GPU driver. Selecione as versões: CUDA version 12.4.1, Driver version 550.127.08 e CUDNN version 9.2.0.82.

    ⑪: System Disk > Capacity. 60 GiB.

    ⑫⑬⑭: Assign public IPv4 address para permitir que a instância acesse a internet e baixe arquivos de modelo. Para Bandwidth Billing Method, selecione Pay-by-traffic. Para Maximum Bandwidth, selecione 100 Mbps.

    ⑮⑯⑰: Crie um novo grupo de segurança básico. Abra pelo menos as portas SSH (TCP: 22) e ICMP (IPv4) para permitir conexões remotas.

    ⑱⑲⑳: Logon Credential. Esta credencial é usada para fazer login na instância. Você pode selecionar um par de chaves ou uma senha. Siga as instruções na tela para concluir a configuração.

    21:Instance Name. Especifique um nome para a instância para facilitar a identificação e localização. Este tópico usa ess-lora-deepseek7b-template como exemplo.

    Após concluir a configuração, clique em Confirm Order e aguarde a criação da instância.

  2. Após a criação da instância, conecte-se a ela e aguarde a instalação do driver da GPU.

    1. Acesse ECS console - Instances.

    2. Localize a instância criada na etapa anterior e clique em Connect na coluna Actions. Conecte-se à instância usando o Workbench e faça login conforme solicitado.

      Se não conseguir encontrar a instância, verifique se a região atual corresponde à região da instância. É possível alternar regiões no canto superior esquerdo.
      Se a instância estiver parada, atualize a página e aguarde a inicialização.
    3. Após conectar-se à instância, aguarde a conclusão da instalação do driver da GPU. Depois da instalação, você será solicitado a reconectar.

      Se a interface travar, tente atualizar a página e reconectar à instância.
      Welcome to Alibaba Cloud Elastic Compute Service !
      
      Last login: Tue Mar 18 21:12:39 2025 from xxx
        % Total    % Received % Xferd  Average Speed   Time    Time     Current
                                       Dload  Upload   Total   Spent    Left  Speed
      100    21  100    21    0     0    875      0 --:--:-- --:--:-- --:--:--   913
      
      Driver-xxx installing, it takes 0 minutes. Remaining installation time 11 to 15 minutes!
      [cuda-12.4.1. Installing, it tasks 2 to 5 minutes. Remaining installation time 9 to 12 minutes!

      Não consigo ver esta página. Como verifico a instalação?

      Se esta interface não aparecer após a conexão com a instância, o driver já pode estar instalado. Execute o comando a seguir para confirmar a instalação do driver:

      nvidia-smi

      Se a saída a seguir for exibida, a instalação está concluída.

      root@ixxx:~# nvidia-smi
      Wed Mar 26 09:40:48 2025
      +-----------------------------------------------------------------------------------------+
      | NVIDIA-SMI 550.127.08    Driver Version: 550.127.08    CUDA Version: 12.4              |
      |-------------------------------------------+------------------------+-------------------|
      | GPU  Name        Persistence-M |  Bus-Id        Dis.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf    Pwr:Usage/Cap |                     | Memory-Usage | GPU-Util  Compute M. |
      |===========================================================================================|
      |  0   NVIDIA A10         On |  00000000:00:07.0 Off |                    0 |
      |  0%   27C    P8       9W / 150W |      1MiB / 23028MiB |      0%      Default |
      +-------------------------------------------+------------------------+-------------------+
      
      +-----------------------------------------------------------------------------------------+
      | Processes:                                                                               |
      |  GPU   GI   CI     PID   Type   Process name                         GPU Memory         |
      |        ID   ID                                                        Usage              |
      |=========================================================================================|
      |  No running processes found                                                              |
      +-----------------------------------------------------------------------------------------+

      Se essa saída não aparecer, o driver não foi instalado ou apresenta algum problema. Recomendamos criar uma nova instância e selecionar Auto-install GPU driver durante a configuração.

      Para instalar o driver manualmente, consulte Instalar manualmente o driver Tesla em uma instância Linux otimizada para computação acelerada por GPU .
  3. Instale as dependências Python.

    Execute os comandos a seguir para instalar as dependências necessárias para o treinamento.

    A imagem Ubuntu 22.04 64-bit usada neste tutorial já inclui o Python 3.10, portanto, não é necessária uma instalação separada do Python.
    # The Ubuntu 22.04 image includes Python 3.10, so no extra installation is needed.
    python3 -m pip install --upgrade pip
    # Switch to the Alibaba Cloud internal PyPI mirror.
    pip config set global.index-url http://mirrors.cloud.aliyuncs.com/pypi/simple/
    
    pip install modelscope==1.22.3
    pip install openai==1.61.0
    pip install tqdm==4.67.1
    pip install "vllm>=0.5.1" -U
    pip install "lmdeploy>=0.5,<0.6.5" -U --no-deps
    pip install autoawq -U --no-deps
    pip install auto_gptq optimum bitsandbytes -U
    pip install ms-swift[all]
    pip install timm -U
    pip install deepspeed==0.14.* -U
    pip install qwen_vl_utils decord librosa pyav icecream -U
Enquanto aguarda a instalação das dependências, clique no ícone image no canto superior direito para abrir um multi-terminal e prosseguir simultaneamente com a Etapa 1,2.

1,2 Crie e monte um bucket do OSS

Crie um bucket no OSS e monte-o na instância ECS. Esse bucket armazena os arquivos de pesos do modelo, conjuntos de dados e checkpoints gerados durante o treinamento.

  1. Acesse o OSS console para criar um bucket.

    A seguir estão os principais parâmetros de configuração. Mantenha os valores padrão para quaisquer parâmetros não mencionados.

    2. Bucket. Você usará este nome de bucket ao montá-lo posteriormente.

    3. Region. Selecione Region-specific. A região deve ser a mesma da instância ECS. Neste exemplo, a região é China (Hangzhou).

    Instâncias ECS podem acessar buckets do OSS na mesma região pela rede interna sem custo de tráfego. Para mais informações, consulte Acessar recursos do OSS a partir de uma instância ECS pela rede interna.
  2. Crie e anexe uma função RAM.

    Uma função RAM autoriza a instância ECS a acessar seu bucket do OSS. Para criar e anexar uma função RAM, siga estas etapas:

    1. No console RAM, crie uma função RAM. Os principais parâmetros de configuração estão descritos abaixo.

      Navegue até a página Roles do console Resource Access Management (RAM) e clique em Create Role.

      ②: Principal type. Selecione Cloud Service.

      ③: Principal name. Selecione ECS. Isso especifica que a função será concedida a uma instância ECS.

      ④: Clique em OK e defina um nome para a função RAM conforme solicitado.

    2. No console RAM, crie a seguinte política personalizada.

      Vá para a página Policies do console Resource Access Management (RAM) e clique em Create Policy.

      Selecione a aba Script Editor e insira o seguinte script de política.

      ③: Esta política concede acesso total a um bucket específico. O script da política é o seguinte.

      Importante

      Ao definir a política, substitua <bucket_name> pelo seu Bucket.

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "oss:*",
                  "Resource": [
                      "acs:oss:*:*:<bucket_name>",
                      "acs:oss:*:*:<bucket_name>/*"
                  ]
              }
          ]
      }

      Após a configuração, clique em OK e defina um nome para a política conforme solicitado.

    3. No console RAM, conceda permissões à função RAM.

      ⑥: Principal. Selecione a função RAM criada anteriormente.

      ⑦: Permission Policy. Selecione a política personalizada criada anteriormente.

      Após a configuração, clique em OK.

    4. Acesse o ECS console e anexe a função RAM à instância.

      Se não conseguir encontrar a instância, verifique se a região atual corresponde à região da instância. É possível alternar regiões no canto superior esquerdo.

      Na lista de instâncias do ECS console, localize a instância de destino e anexe a função RAM criada na Etapa 1,2 através da coluna Actions.

  3. Monte o bucket na instância ECS.

    1. Conecte-se à instância criada na Etapa 1,1 e execute o comando a seguir para instalar a ferramenta ossfs.

      wget https://gosspublic.alicdn.com/ossfs/ossfs_1.91.5_ubuntu22.04_amd64.deb
      apt-get update
      DEBIAN_FRONTEND=noninteractive apt-get install gdebi-core
      DEBIAN_FRONTEND=noninteractive gdebi -n ossfs_1.91.5_ubuntu22.04_amd64.deb
    2. Execute o comando a seguir para concluir a operação de montagem. Certifique-se de substituir os seguintes espaços reservados no comando:

      • <bucket_name>: Substitua pelo Bucket do bucket criado.

        Visualizar nome do bucket

        Acesse o OSS console para localizar o bucket criado.

      • <ecs_ram_role>: Substitua pelo nome da função RAM criada.

        Visualizar nome da função RAM

        Acesse o ECS console, localize a instância com a função RAM anexada e vá para a página Attach/Detach RAM Role

        . Nesta página, é possível visualizar as funções RAM anexadas à instância.

        Se não conseguir encontrar a instância, verifique se a região atual corresponde à região da instância. É possível alternar regiões no canto superior esquerdo.

        Na lista de instâncias do ECS console, localize a instância ess-lora-deepseek-7b-template e anexe a função RAM criada na Etapa 1,2 através da coluna Actions.

      • <internal_endpoint>: Substitua por oss-cn-hangzhou-internal.aliyuncs.com.

        Importante

        Este tutorial utiliza um bucket na região China (Hangzhou), portanto, o endpoint interno da VPC é oss-cn-hangzhou-internal.aliyuncs.com.

        Como obter o endpoint se o seu bucket não estiver na região Hangzhou

        Se o seu bucket do OSS não estiver na região Hangzhou, obtenha o endpoint interno da VPC e substitua o valor de <internal_endpoint>.

        Na página Overview do seu bucket no OSS console, localize as informações de Access Endpoint. Obtenha o endereço do endpoint para VPC Network Access (Internal Network) from ECS (por exemplo, oss-cn-hangzhou-internal.aliyuncs.com).

      # Replace with your bucket name, internal endpoint, and RAM role.
      BUCKET_NAME="<bucket_name>"
      ECS_RAM_ROLE="<ecs_ram_role>"
      INTERNAL_ENDPOINT="<internal_endpoint>"
      
      # Bucket mount path
      BUCKET_MOUNT_PATH="/mnt/oss-data"
      
      # 1. Back up the fstab file before mounting.
      cp /etc/fstab /etc/fstab.bak
      
      # 2. Create the mount directory.
      mkdir $BUCKET_MOUNT_PATH
      # 3. Mount the bucket to the instance.
      ossfs $BUCKET_NAME $BUCKET_MOUNT_PATH -ourl=$INTERNAL_ENDPOINT -oram_role=http://100.100.100.200/latest/meta-data/ram/security-credentials/$ECS_RAM_ROLE
      # 4. Set auto-mount on startup.
      echo "ossfs#$BUCKET_NAME $BUCKET_MOUNT_PATH fuse _netdev,url=http://$INTERNAL_ENDPOINT,ram_role=http://100.100.100.200/latest/meta-data/ram/security-credentials/$ECS_RAM_ROLE,allow_other 0 0" | sudo tee -a /etc/fstab
  4. (Verificação) Teste se o espaço de armazenamento está disponível.

    1. Faça upload de qualquer arquivo para o bucket do OSS.

      No OSS console, vá para a página Files do seu bucket. Clique em Upload File e envie um arquivo de teste para verificar a montagem.

    2. Na instância, execute o comando a seguir para verificar se é possível visualizar o arquivo do bucket do OSS no diretório.

      ls /mnt/oss-data/

      Se o arquivo estiver visível, a montagem foi bem-sucedida.

      root@ixxx:~# ls /mnt/oss-data/
      test.txt

    Por que não consigo ver o arquivo no bucket do OSS?

    Isso pode ocorrer devido a uma falha na montagem. Siga estas etapas para solucionar o problema:

    1. Verifique se a instância ECS e o bucket do OSS estão na mesma região. Certifique-se de que <internal_endpoint> no comando de montagem foi substituído corretamente pelo endpoint interno da VPC do bucket.

    2. Confira se <bucket_name> no comando de montagem foi substituído corretamente pelo nome do seu bucket do OSS.

    3. Tente anexar novamente a função RAM à instância ECS. Além disso, verifique se <ecs_ram_role> no comando de montagem corresponde ao nome da função RAM anexada.

    4. Substitua corretamente <bucket_name>, <internal_endpoint> e <ecs_ram_role> no comando a seguir e execute-o para remontar.

      # Replace with your bucket name, internal endpoint, and RAM role.
      BUCKET_NAME="<bucket_name>"
      ECS_RAM_ROLE="<ecs_ram_role>"
      INTERNAL_ENDPOINT="<internal_endpoint>"
      
      # Bucket mount path
      BUCKET_MOUNT_PATH="/mnt/oss-data"
      
      # 1. Try to unmount.
      umount $BUCKET_MOUNT_PATH
      
      # 2. Restore /etc/fstab from backup.
      cp /etc/fstab.bak /etc/fstab
      
      # 3. Remount the bucket to the instance.
      ossfs $BUCKET_NAME $BUCKET_MOUNT_PATH -ourl=$INTERNAL_ENDPOINT -oram_role=http://100.100.100.200/latest/meta-data/ram/security-credentials/$ECS_RAM_ROLE
      # 4. Re-enable auto-mount on startup.
      echo "ossfs#$BUCKET_NAME $BUCKET_MOUNT_PATH fuse _netdev,url=http://$INTERNAL_ENDPOINT,ram_role=http://100.100.100.200/latest/meta-data/ram/security-credentials/$ECS_RAM_ROLE,allow_other 0 0" | sudo tee -a /etc/fstab
    1. Verifique se é possível visualizar arquivos do bucket do OSS no diretório de montagem (/mnt/oss-data).

      ls /mnt/oss-data/

1,3 Prepare o modelo e o conjunto de dados

Baixe os pesos do modelo e o conjunto de dados da comunidade ModelScope para o diretório de montagem do bucket do OSS.

  1. Baixe o conjunto de dados

    # Bucket mount path
    BUCKET_MOUNT_PATH="/mnt/oss-data"
    
    # Download the fine-tuning dataset from the ModelScope community
    # Use the modelscope tool installed in Step 1.1
    modelscope download --dataset swift/self-cognition --local_dir $BUCKET_MOUNT_PATH/self-cognition
    modelscope download --dataset AI-ModelScope/alpaca-gpt4-data-zh --local_dir $BUCKET_MOUNT_PATH/alpaca-gpt4-data-zh
    modelscope download --dataset AI-ModelScope/alpaca-gpt4-data-en --local_dir $BUCKET_MOUNT_PATH/alpaca-gpt4-data-en
    Se o progresso do download estagnar, pressione Enter várias vezes.
  2. Baixe os pesos do modelo

    Importante

    O arquivo de pesos do modelo é grande. Se o download falhar ou se você vir uma mensagem please try again, tente executar o comando novamente para retomar o download.

    # Bucket mount path
    BUCKET_MOUNT_PATH="/mnt/oss-data"
    
    # Download the DeepSeek-R1-Distill-Qwen-7B model from the ModelScope community
    modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local_dir $BUCKET_MOUNT_PATH/DeepSeek-R1-Distill-Qwen-7B
    Se o progresso do download estagnar, pressione Enter várias vezes.
  3. Teste os pesos do modelo

    Após a conclusão do download, execute o comando a seguir para realizar um teste de inferência com o modelo e verificar se o arquivo de pesos está completo.

    # Bucket mount path
    BUCKET_MOUNT_PATH="/mnt/oss-data"
    
    CUDA_VISIBLE_DEVICES=0 swift infer \
        --model $BUCKET_MOUNT_PATH/DeepSeek-R1-Distill-Qwen-7B \
        --stream true \
        --infer_backend pt \
        --max_new_tokens 2048

    Após o carregamento do modelo, inicie uma conversa com o modelo de linguagem grande. Se os pesos do modelo falharem ao carregar, baixe-os novamente.

    [INFO:swift] Start time of running main: 2025-03-26 13:35:50.564493
    [INFO:swift] request_config: RequestConfig(max_tokens=2048, temperature=None, top_k=None, top_p=None, repetition_penalty=None, num_beams=1, stop=[], seed=None, stream=True, logprobs=False, top_logprobs=None, n=1, best_of=None, presence_penalty=0.0, frequency_penalty=0.0, length_penalty=1.0)
    [INFO:swift] Input 'exit' or 'quit' to exit the conversation.
    [INFO:swift] Input 'multi-line' to switch to multi-line input mode.
    [INFO:swift] Input 'reset-system' to reset the system and clear the history.
    [INFO:swift] Input 'clear' to clear the history.
    <<< Who are you?

    Após concluir o teste, insira exit para encerrar a conversa.

1,4 Escreva um script de treinamento automático

  1. Escreva um script de treinamento automático.

    Execute o comando a seguir para criar um script de treinamento automático e conceder permissões de execução. Este script retoma automaticamente o treinamento a partir do checkpoint mais recente e determina quando o treinamento é concluído.

    # Create an automatic training script.
    cat <<EOF > /root/train.sh
    #!/bin/bash
    
    # Bucket mount path
    BUCKET_MOUNT_PATH="/mnt/oss-data"
    
    # Storage directory for model weights and datasets
    MODEL_PATH="\$BUCKET_MOUNT_PATH/DeepSeek-R1-Distill-Qwen-7B"
    DATASET_PATH="\$BUCKET_MOUNT_PATH/alpaca-gpt4-data-zh#500 \$BUCKET_MOUNT_PATH/alpaca-gpt4-data-en#500 \$BUCKET_MOUNT_PATH/self-cognition#500"
    
    # Set the output directory
    OUTPUT_DIR="\$BUCKET_MOUNT_PATH/output"
    mkdir -p "\$OUTPUT_DIR"
    
    # Logic to check if training is already complete
    if [ -f "\$OUTPUT_DIR/logging.jsonl" ]; then
        last_line=\$(tail -n 1 "\$OUTPUT_DIR/logging.jsonl")
        if echo "\$last_line" | grep -q "last_model_checkpoint" && echo "\$last_line" | grep -q "best_model_checkpoint"; then
            echo "Training already completed. Exiting."
            exit 0
        fi
    fi
    
    # Initialize resume argument
    RESUME_ARG=""
    
    # Find the latest checkpoint
    LATEST_CHECKPOINT=\$(ls -dt \$OUTPUT_DIR/checkpoint-* 2>/dev/null | head -1)
    
    if [ -n "\$LATEST_CHECKPOINT" ]; then
        RESUME_ARG="--resume_from_checkpoint \$LATEST_CHECKPOINT"
        echo "Resume training from: \$LATEST_CHECKPOINT"
    else
        echo "No checkpoint found. Starting new training."
    fi
    
    # Start the training command
    CUDA_VISIBLE_DEVICES=0 swift sft \\
        --model \$MODEL_PATH \\
        --train_type lora \\
        --dataset \$DATASET_PATH \\
        --torch_dtype bfloat16 \\
        --num_train_epochs 1 \\
        --per_device_train_batch_size 1 \\
        --per_device_eval_batch_size 1 \\
        --learning_rate 1e-4 \\
        --lora_rank 8 \\
        --lora_alpha 32 \\
        --target_modules all-linear \\
        --gradient_accumulation_steps 16 \\
        --eval_steps 50 \\
        --save_steps 10 \\
        --save_total_limit 5 \\
        --logging_steps 5 \\
        --max_length 2048 \\
        --output_dir "\$OUTPUT_DIR" \\
        --add_version False \\
        --overwrite_output_dir True \\
        --system 'You are a helpful assistant.' \\
        --warmup_ratio 0.05 \\
        --dataloader_num_workers 4 \\
        --model_author swift \\
        --model_name swift-robot \\
        \$RESUME_ARG
    EOF
    
    # Grant executable permissions
    chmod +x /root/train.sh

    Testar se o script executa corretamente

    Execute o comando a seguir para testar se o script roda corretamente:

    ./train.sh

    Se o modelo carregar e o treinamento iniciar normalmente após a execução do comando, isso confirma que o arquivo do modelo está correto e todas as dependências estão presentes. Pressione CTRL + C para sair do treinamento.

    Train:   0%|          | 0/93 [00:00<?, ?it/s]

    Se não executar corretamente, reinstale as dependências Python da Etapa 1,1 e baixe novamente os pesos e o conjunto de dados da Etapa 1,3.

  2. Crie um service Linux e configure-o para iniciar na inicialização.

    Execute o comando a seguir para criar um service e configurar o script de treinamento para iniciar automaticamente na inicialização.

    # Create log storage directory
    mkdir -p /root/train-service-log
    
    # Write the Service configuration file
    cat <<EOF > /etc/systemd/system/train.service
    [Unit]
    Description=Train AI Model Script
    After=network.target local-fs.target remote-fs.target
    Requires=local-fs.target remote-fs.target
    
    [Service]
    ExecStart=/root/train.sh
    WorkingDirectory=/root/
    User=root
    Environment="PATH=/usr/bin:/usr/local/bin"
    Environment="CUDA_VISIBLE_DEVICES=0"
    StandardOutput=append:/root/train-service-log/train.log
    StandardError=append:/root/train-service-log/train_error.log
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    # Reload systemd configuration
    systemctl daemon-reload
    # Configure the train.service to start on boot
    systemctl enable train.service

    O comando retorna a seguinte saída após a conclusão:

    Created symlink /etc/systemd/system/multi-user.target.wants/train.service → /etc/systemd/system/train.service.

1,5 Crie a imagem personalizada

Após concluir todas as etapas anteriores, crie uma imagem personalizada a partir da instância configurada. Essa imagem servirá como imagem de inicialização para novas instâncias durante o scale-out, eliminando a necessidade de reinstalar dependências.

  1. Acesse a página Instances do ECS console.

  2. Crie a imagem conforme descrito abaixo.

    Na lista de instâncias do ECS console, localize a instância de destino. Na coluna Actions, clique em More > Disks and Images > Create Custom Image. Conclua a criação da imagem conforme solicitado.

  3. Aguarde a criação da imagem. Esse processo leva cerca de 5 minutos. É possível verificar o progresso de criação na página Images do ECS console.

Nota

Após a criação da imagem, você pode liberar a instância criada na Etapa 1,1.

2. Crie um grupo de dimensionamento

Configure um grupo de dimensionamento para automatizar o gerenciamento de instâncias. Quando uma instância é interrompida, o grupo de dimensionamento cria automaticamente uma nova instância spot ou de pagamento conforme o uso para continuar o treinamento. Quando a capacidade spot é restaurada, ele substitui as instâncias de pagamento conforme o uso por instâncias spot para reduzir custos.

2,1 Crie um grupo de dimensionamento

Primeiro, é necessário criar um grupo de dimensionamento. Siga estas etapas.

  1. Acesse o Auto Scaling console para criar um grupo de dimensionamento.

    Importante

    Certifique-se de que o grupo de dimensionamento esteja na mesma região da instância criada na Etapa 1,1.

  1. Configure o grupo de dimensionamento da seguinte forma. Para descrições detalhadas dos parâmetros, consulte Parâmetros.

    Configure os seguintes parâmetros: Defina Scaling Group Name como ess-lora-deepseek-7b, Type como ECS e Source for Instance Configuration como Existing instance. Defina Min. Instances como 0, Max. Instances como 1 e mantenha o Default Cooldown Time em 300 segundos.

    Importante

    Ao selecionar uma VPC e um vSwitch em ⑤⑥, recomendamos selecionar vSwitches em múltiplas zonas de disponibilidade. Isso permite que o grupo de dimensionamento provisione recursos entre zonas, aumentando a probabilidade de criar instâncias spot com sucesso.

    Importante

    Se desejar maximizar a economia usando apenas instâncias spot para treinamento, desative tanto Use Pay-as-you-go Instances to Supplement Spot Capacity quanto Replace Pay-as-you-go Instances with Spot Instances.

  1. Após a configuração, clique em Create. Em seguida, prossiga para criar uma configuração de dimensionamento conforme solicitado.

2,2 Crie uma configuração de dimensionamento

Uma configuração de dimensionamento define as especificações da instância, imagem e outras configurações. O grupo de dimensionamento usa essa configuração para criar novas instâncias automaticamente. Na página Create Scaling Configuration, conclua as seguintes configurações:

Não está na página Create Scaling Configuration?

Retorne à página Create Scaling Configuration seguindo estas etapas.

  1. Acesse o Auto Scaling console.

    Importante

    Certifique-se de que o grupo de dimensionamento esteja na mesma região da instância criada na Etapa 1,1.

  2. Na lista de grupos de dimensionamento, localize o grupo criado na Etapa 2,1 e clique em seu ID para acessar a página de detalhes. Siga as etapas abaixo para navegar até a página Create Scaling Configuration.

    Na página de detalhes do grupo de dimensionamento, alterne para a aba Scaling Configurations e clique em Create Scaling Configuration.

1. Scaling Configuration Name: ess-config.

②: Billing Method: Spot Instance.

③ e ④: Image. Selecione Custom Images e, em seguida, selecione a imagem personalizada criada na Etapa 1,5.

⑤: Instance Configuration Mode. Selecione Specify Instance Type.

6. Instance Usage Duration. Selecione 1 Hour. Após a instância executar por uma hora, o sistema começa a verificar se deve interromper e recuperar a instância.

Se selecionar No Specified Usage Duration, é possível usar instâncias spot a um custo menor, mas elas têm maior probabilidade de interrupção. Isso pode levar à recuperação da instância antes que um checkpoint válido seja criado, retardando o progresso do treinamento. Para mais informações sobre as diferenças entre essas duas opções, consulte Usar instâncias spot em grupos de dimensionamento para reduzir custos.

⑦: Highest price per instance. Selecione Use Automatic Bid para dar lance automaticamente com base no preço de mercado.

8. Select an instance type. Selecione o tipo de instância definido ao criar a instância na Etapa 1,1, que é ecs.gn7i-c8g1.2xlarge.

9. Security Group. Selecione o grupo de segurança configurado ao criar a instância na Etapa 1,1.

Este tutorial é uma solução de treinamento offline, portanto, não é necessário atribuir um endereço IP público.

⑩: Logon Credential. Selecione Use Predefined Password.

⑪⑫⑬: Advanced Settings > Instance RAM Role. Selecione a função RAM criada na Etapa 1,2. Quando o grupo de dimensionamento cria instâncias automaticamente, essa função RAM será anexada automaticamente às novas instâncias.

Nota

Após clicar em Create, pode aparecer um aviso sobre insufficient scaling configuration strength. Clique em Continue.

Após criar a configuração de dimensionamento, ative a configuração de dimensionamento e ative o grupo de dimensionamento conforme solicitado.

Após a criação bem-sucedida da configuração de dimensionamento, clique em Enable Configuration na caixa de diálogo exibida.

Na caixa de diálogo de confirmação Select Scaling Configuration, clique em OK.

Na caixa de diálogo de confirmação Enable Scaling Group, clique em OK para ativar o grupo de dimensionamento.

3. Inicie a tarefa de treinamento

Após configurar o grupo de dimensionamento, ajuste o número esperado de instâncias para 1.

Acesse a página de detalhes do grupo de dimensionamento e visualize o Instance Scaling Overview. As contagens atuais de instâncias são todas 0.

Clique em Modify na seção Instance Scaling Overview. Ative a opção Expected Number of Instances, defina o valor como 1 e clique em OK. O grupo de dimensionamento criará automaticamente uma instância spot.

Em seguida, o grupo de dimensionamento cria automaticamente uma nova instância e inicia a tarefa de treinamento.

O grupo de dimensionamento verifica periodicamente se o número de instâncias no grupo corresponde ao número esperado. Como a contagem atual é 0, um scale-out é acionado automaticamente para criar uma nova instância.
Nota
  • Após ajustar o número esperado de instâncias, pode haver um atraso na criação. Visualize as atividades em andamento na aba Scaling Activities.

  • Depois que a instância for criada e iniciada, localize uma pasta output no seu bucket do OSS. Essa pasta armazena os arquivos de checkpoint gerados durante o treinamento.

4. Simule uma interrupção (verificação)

Após a instância iniciar o treinamento, verifique o diretório output no seu bucket do OSS em busca de uma pasta como checkpoint-10. Assim que existir um checkpoint, libere manualmente a instância de treinamento para simular uma interrupção:

  1. Libere a instância manualmente.

    1. Primeiro, acesse a aba Instances do grupo de dimensionamento e clique no Instance ID para ir à página Instance Details correspondente.

    2. Na página de detalhes da instância, clique em All Operations > Release no canto superior direito e siga as instruções para liberar a instância.

  2. Verifique se o treinamento retoma a partir do checkpoint mais recente.

    Aguarde o grupo de dimensionamento criar uma nova instância. Após a criação da instância, conecte-se a ela e visualize o log da tarefa.

    1. Acesse a aba Instances do grupo de dimensionamento e clique no Instance ID para ir à página Instance Details correspondente.

    2. Clique em Connect no canto superior direito e conecte-se à instância conforme solicitado.

    3. Execute o comando a seguir para visualizar o log de treinamento do modelo. Este caminho de saída de log foi definido para o service de inicialização na Etapa 1,4.

      cat /root/train-service-log/train.log

      Como é possível observar, a tarefa de treinamento retoma a partir do checkpoint mais recente.

      root@ixxx:~# cat train-service-log/train.log
      Resume training from: /mnt/oss-data/output/checkpoint-10
      run sh: /usr/bin/python3 /usr/local/lib/python3.10/dist-packages/xxx
        s-data/self-cognition#500 --torch_dtype bfloat16 --num_train_epochs xxx
        --eval_steps 50 --save_steps 10 --save_total_limit 5 --logging_steps xxx
        --num_workers 4 --model_author swift --model_name swift-robot --resume xxx

Próximas etapas

Usar o modelo ajustado para inferência

Após a conclusão da tarefa de ajuste fino, uma pasta checkpoint-93 é gerada no diretório output do bucket do OSS. Em seguida, conecte-se à instância e execute o comando a seguir para interagir com o modelo ajustado.

# Bucket mount path
BUCKET_MOUNT_PATH="/mnt/oss-data"

# Set the output directory
OUTPUT_DIR="$BUCKET_MOUNT_PATH/output"

# Find the latest checkpoint
LATEST_CHECKPOINT=$(ls -dt $OUTPUT_DIR/checkpoint-* 2>/dev/null | head -1)

CUDA_VISIBLE_DEVICES=0 \
swift infer \
    --adapters $LATEST_CHECKPOINT \
    --stream true \
    --temperature 0 \
    --max_new_tokens 2048
[INFO:swift] Start time of running main: 2025-03-26 15:15:11.595764
[INFO:swift] request_config: RequestConfig(max_tokens=2048, temperature=0.0, top_k=None, top_p=None, repetition_penalty=None, num_beams=1, stop=[], seed=None, stream=True, logprobs=False, top_logprobs=None, n=1, best_of=None, presence_penalty=0.0, frequency_penalty=0.0, length_penalty=1.0)
[INFO:swift] Input 'exit' or 'quit' to exit the conversation.
[INFO:swift] Input 'multi-line' to switch to multi-line input mode.
[INFO:swift] Input 'reset-system' to reset the system and clear the history.
[INFO:swift] Input 'clear' to clear the history.
<<< Who are you?

Liberar recursos

Para evitar cobranças adicionais, libere os recursos usados neste tutorial seguindo estas etapas.

  1. Excluir o grupo de dimensionamento. Excluir o grupo de dimensionamento criado na Etapa 2 também excluirá as instâncias criadas automaticamente por ele.

  2. Excluir a imagem personalizada. Exclua a imagem personalizada criada na Etapa 1,5.

  3. Excluir o bucket. Exclua o bucket do OSS criado na Etapa 1,2.

  4. Excluir a função RAM. Exclua a função RAM criada na Etapa 1,2.

  5. Liberar a instância. Libere a instância criada na Etapa 1,1.

Recomendações para ambientes de produção

Adapte esta solução para produção com base nas necessidades do seu negócio e nas recomendações a seguir.

  • Integre o CloudMonitor para tratamento de interrupções

    Integre o CloudMonitor ao seu código de treinamento para detectar e responder a eventos de interrupção de instância spot. Salvar um checkpoint cinco minutos antes de uma interrupção reduz a perda de progresso ao retomar o treinamento. A arquitetura aprimorada é a seguinte:

    image

  • Estabeleça um mecanismo de recuperação de tarefas

    Este tutorial retoma o treinamento a partir do checkpoint mais recente sem validá-lo. Em produção, implemente detecção de anomalias para identificar checkpoints inválidos e retomar automaticamente a partir do último checkpoint válido.

  • Aprimore o processo de conclusão de tarefas

    Adicione lógica ao seu código de treinamento para detectar a conclusão da tarefa. Após a conclusão, chame a API do grupo de dimensionamento através da CLI ou SDK para definir o número esperado de instâncias como 0. O grupo de dimensionamento então libera as instâncias excedentes automaticamente, evitando custos desnecessários.

    Além disso, quando a tarefa for concluída, você pode relatar eventos personalizados ao CloudMonitor. Isso permite receber notificações sobre os resultados do treinamento por e-mail, SMS ou chatbot do DingTalk.

  • Use um sistema de arquivos de alto desempenho

    Para modelos com um grande número de parâmetros, o OSS pode se tornar um gargalo. Utilize um sistema de arquivos de alto throughput e baixa latência, como CPFS, para melhorar o desempenho de I/O.

  • Configure vSwitches multi-AZ para maior disponibilidade

    Um vSwitch de zona única limita a criação de instâncias a uma zona, o que aumenta o risco de falhas de scale-out devido à capacidade insuficiente. Configure vSwitches em múltiplas zonas de disponibilidade para que o sistema possa criar instâncias entre zonas quando uma instância spot for recuperada.

Referências