커스텀 OS 이미지 사용

TPU VM에 커스텀 OS 이미지를 사용하여 소프트웨어를 미리 로드하거나, 특정 OS 배포를 사용하거나, 커스텀 커널 수정사항을 적용할 수 있습니다. 맞춤 이미지를 만드는 작업에는 이미지 생성 프로세스 중에 특정 시스템을 수정하고 TPU 기능에 필요한 부팅 시간 작업을 처리하도록 이미지를 구성하는 작업이 포함됩니다.

TPU와 함께 맞춤 OS 이미지를 사용하는 경우 다음 면책 조항을 참고하세요.

  • Google에서는 기본 TPU 최적화 Ubuntu 장기 지원 (LTS) 이미지를 제공합니다. 이 페이지에 나열된 OS 변경사항은 Google에서 지원하고 TPU에 최적화된 Ubuntu LTS 이미지에 대해서만 검증됩니다.
  • 다른 OS 배포 또는 맞춤 이미지에 필요한 OS 변경사항을 추정하는 것은 사용자의 책임입니다. Google은 이 페이지에 나열된 Ubuntu 수정사항이 다른 OS 배포판이나 맞춤 커널이 있는 다른 Ubuntu 이미지와 호환된다고 보장하지 않습니다.
  • Google은 기본 TPU 최적화 Ubuntu LTS 이미지를 제외한 OS 이미지를 빌드하거나 테스트를 제공하지 않습니다. 맞춤 OS 이미지를 빌드하고 테스트해야 합니다.

기본 TPU 최적화 Ubuntu LTS 이미지에 대한 자세한 내용은 TPU OS 이미지를 참고하세요.

기본 요건

기본 이미지에 다음 구성요소가 설치되어 있어야 합니다.

  • Python 3
  • gcloud CLI

이미지 생성 중에 수정

맞춤 Ubuntu 이미지를 빌드하는 동안 다음 수정사항을 적용하세요.

TPU 기기를 VFIO에 바인딩

게스트 OS가 TPU 하드웨어에 액세스하도록 허용하려면 TPU 기기를 vfio-pci 드라이버에 바인딩해야 합니다.

  1. /etc/udev/rules.d/99-tpu-vfiopci.rules라는 udev 규칙 파일을 만듭니다.

    # Rules for binding vfio-enabled TPU devices to vfio-pci.
    
    # v5p
    SUBSYSTEM=="pci", ACTION=="add", ATTRS{vendor}=="0x1ae0", ATTRS{device}=="0x0062", ATTRS{subsystem_vendor}=="0x1ae0", ATTRS{subsystem_device}=="0x00ad", DRIVER!="vfio-pci", TAG+="bind_to_vfio_pci"
    
    # v6e
    SUBSYSTEM=="pci", ACTION=="add", ATTRS{vendor}=="0x1ae0", ATTRS{device}=="0x006f", ATTRS{subsystem_vendor}=="0x1ae0", ATTRS{subsystem_device}=="0x00d1", DRIVER!="vfio-pci", TAG+="bind_to_vfio_pci"
    
    # TPU7x
    SUBSYSTEM=="pci", ACTION=="add", ATTRS{vendor}=="0x1ae0", ATTRS{device}=="0x0076", ATTRS{subsystem_vendor}=="0x1ae0", ATTRS{subsystem_device}=="0x00f2", DRIVER!="vfio-pci", TAG+="bind_to_vfio_pci"
    
    # Bind all 'bind_to_vfio_pci' tagged devices to vfio-pci.
    TAG=="bind_to_vfio_pci", RUN+="/lib/udev/bind_to_vfio_pci.sh $kernel"
    
  2. /lib/udev/bind_to_vfio_pci.sh이라는 스크립트를 만듭니다.

    #!/bin/bash
    #!/usr/bin/env bash
    
    # Run ./bind_to_vfio_pci.sh <DBDF>
    # Binds the device at <DBDF> to vfio-pci.
    # If the device is already bound to a driver, unbinds it first.
    
    # Load the vfio-pci module into the kernel. No-op if already loaded.
    modprobe vfio-pci
    
    DBDF_REGEX="^[[:xdigit:]]{4}:[[:xdigit:]]{2}:[[:xdigit:]]{2}.[[:xdigit:]]$"
    
    unset BDF
    if [[ $1 =~ $DBDF_REGEX ]]; then
        BDF=$1
    else
        echo "Error: BDF arg ($1) is not in form dddd:bb:dd.f"
        exit 1
    fi
    
    PCI_PATH="/sys/bus/pci/devices/$BDF"
    
    echo "vfio-pci" > "$PCI_PATH/driver_override"
    
    PCI_DRIVER_PATH="$PCI_PATH/driver"
    if [[ -d "$PCI_DRIVER_PATH" ]]; then
        curr_driver=$(readlink "$PCI_DRIVER_PATH")
            curr_driver=${curr_driver##*/}
        if [[ $curr_driver == "vfio-pci" ]]; then
            echo "$BDF already bound to vfio-pci"
            exit 0
        else
            echo "$BDF" > "$PCI_DRIVER_PATH/unbind"
            if [[ -d "$PCI_DRIVER_PATH" ]]; then
                echo "Error: Unable to unbind $PCI_DRIVER_PATH"
                exit 1
            fi
            echo "Unbound $BDF from driver $curr_driver"
        fi
    fi
    echo "$BDF" > /sys/bus/pci/drivers_probe
    echo "Bound $BDF to vfio-pci"
    
    # Grant read/write access on VFIO device to all users
    IOMMU_GROUP=$(readlink "$PCI_PATH/iommu_group" | xargs basename)
    VFIO_DEV="/dev/vfio/$IOMMU_GROUP"
    if [[ -c "$VFIO_DEV" ]]; then
        chmod 0666 "$VFIO_DEV"
    else
        echo "$VFIO_DEV not found"
        exit 1
    fi
    
    # Set allow_unsafe_interrupts for x86 platforms.
    (uname -a | grep -q x86_64) && echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts
    
    # This is only needed to avoid non-zero exit code from previous command.
    echo "All Done!"
    
  3. 스크립트를 실행 가능하게 만듭니다.

    chmod +x /lib/udev/bind_to_vfio_pci.sh
    
  4. 시스템의 모든 사용자에게 TPU 기기에 대한 액세스 권한을 부여합니다.

    echo 'KERNEL=="accel*" MODE="0666"' >> /etc/udev/rules.d/99-tpu.rules
    

이미지를 수정하여 실적 개선

최적의 성능을 보장하려면 다음 시스템 제한 및 매개변수를 조정하세요.

메모리 한도

단일 프로세스가 /etc/security/limits.conf를 업데이트하여 무제한 메모리를 잠그도록 허용합니다.

echo '*  hard  memlock  unlimited' >> /etc/security/limits.conf
echo '*  soft  memlock  unlimited' >> /etc/security/limits.conf

파일 제한

/etc/security/limits.conf를 업데이트하여 열린 파일 수를 늘립니다.

echo "*    soft    nofile       100000" >> /etc/security/limits.conf
echo "*    hard    nofile       100000" >> /etc/security/limits.conf
echo "root soft    nofile       100000" >> /etc/security/limits.conf
echo "root hard    nofile       100000" >> /etc/security/limits.conf

커널 매개변수

GRUB_CMDLINE_LINUX에 다음 매개변수를 포함하도록 GRUB 구성 (일반적으로 /etc/default/grub에 있음)을 업데이트합니다.

  • idle=poll: CPU가 저전력 유휴 상태로 전환되지 않도록 합니다.
  • intel_iommu=on,sm_on: Intel 입력-출력 메모리 관리 단위(IOMMU)를 사용 설정합니다. TPU7x 및 v5p 아키텍처에 필요합니다.
  • transparent_hugepage=always: 투명한 대형 페이지 (THP)를 사용 설정합니다.

다음 단계에서는 이러한 커널 매개변수를 업데이트하는 방법을 보여줍니다.

  1. 다음 단계에서 사용할 다음 변수를 설정하여 CPU가 저전력 유휴 상태로 전환되지 않도록 합니다.

    kernel_cmdline="idle=poll"
    
  2. Intel 입력-출력 메모리 관리 단위 (IOMMU)를 사용 설정합니다. 이 단계는 TPU7x 및 TPU v5p에 필요합니다.

    kernel_cmdline="${kernel_cmdline} intel_iommu=on,sm_on";
    sed -i "s/GRUB_CMDLINE_LINUX=\"\"/GRUB_CMDLINE_LINUX=\"${kernel_cmdline}\"/" /etc/default/grub
    echo "Status: New kernel cmdline: $(cat /etc/default/grub | grep -e '^GRUB_CMDLINE_LINUX=')"
    
    update-grub
    
  3. Transparent Huge Pages (THP)를 사용 설정합니다.

    echo "Status: Enabling THP"
    sed -i -r 's/GRUB_CMDLINE_LINUX="[a-zA-Z0-9_= ]*/& transparent_hugepage=always/' /etc/default/grub
    
    update-grub
    

vBar 에이전트 설치

vBar 에이전트는 칩 간 상호 연결 (ICI) 네트워크가 작동하는 데 필요합니다.

vBar 에이전트를 설치하려면 다음 명령어를 실행합니다.

  1. Artifact Registry로 Docker를 인증합니다.

    gcloud auth configure-docker us-docker.pkg.dev
    
  2. Artifact Registry에서 Docker 이미지를 가져옵니다.

    docker pull gcr.io/cloud-tpu-v2-images/vbar_control_agent:0.0.1
    
  3. vBar 에이전트 이미지를 사용하여 컨테이너를 실행합니다.

    docker run --privileged --net=host vbar_control_agent:0.0.1
    

선택사항: AI 원격 분석 수집기 설치 및 실행

AI 원격 분석 수집기는 TPU VM 내에서 실행되며 Cloud Monitoring 또는 자체 Prometheus 기반 모니터링 파이프라인을 통해 런타임 및 인프라 측정항목에 액세스할 수 있습니다. ai-telemetry-collector Docker 이미지를 사용하여 맞춤 OS와 함께 AI 원격 분석 수집기를 사용할 수 있습니다. 맞춤 OS에 이미지를 설치하고 config.yaml 파일을 사용하여 수집 간격을 지정하거나, 특정 측정항목을 사용 설정 또는 중지하거나, 내보내기 대상을 변경할 수 있습니다.

AI 원격 분석 수집기를 설치하려면 다음 명령어를 실행하세요.

  1. Artifact Registry로 Docker를 인증합니다.

    gcloud auth configure-docker us-docker.pkg.dev
    
  2. Artifact Registry에서 Docker 이미지를 가져옵니다.

    docker pull gcr.io/cloud-tpu-v2-images/ai-telemetry-collector:latest
    
  3. 기본 구성으로 AI 원격 분석 수집기 이미지를 사용하여 컨테이너를 실행합니다.

    docker run --privileged --net=host ai-telemetry-collector:latest
    

    맞춤 구성 파일을 사용하거나 구성 파일을 추가하는 방법에 대한 자세한 내용은 AI 원격 분석 수집기를 참고하세요.

부팅 시간 수정

VM이 부팅될 때마다 다음 섹션의 작업을 실행하도록 이미지를 구성합니다. cloud-init 도구를 사용하여 인스턴스에 메타데이터를 전달하여 부팅 시간 작업을 구성할 수 있습니다. 다음 섹션의 구성에서는 write_filesruncmd과 같은 모듈을 사용합니다. 작성할 파일을 정의하는 스니펫은 write_files: 키 아래에 포함되어야 하고, 부팅 시 실행해야 하는 명령어는 cloud-init 구성의 runcmd: 키 아래에 포함되어야 합니다.

vBar 에이전트 시작

적절한 사용자 및 그룹 ID로 vBar 제어 에이전트를 시작합니다.

vbar_control_agent --logtostderr --gid= --uid=  --chroot= --census_enabled=false --loas_pwd_fallback_in_corp

환경 변수 구성

TPU 워크로드에 맞게 환경이 올바르게 초기화되도록 하려면 시스템 부팅 프로세스 중에 Compute Engine 메타데이터 서버에서 런타임 구성 변수를 가져와야 합니다. 이렇게 하려면 cloud-init 구성의 write_files: 섹션에 다음 스니펫을 추가하여 /var/scripts/configure-env-vars.sh라는 스크립트를 만듭니다. 이 스크립트는 tpu-env 메타데이터 키에서 속성 검색을 자동화하고 TPU 소프트웨어 스택에서 사용할 수 있도록 /${HOME}/tpu-env에 저장합니다.

 - path: /var/scripts/configure-env-vars.sh
    permissions: 0444
    owner: root
    content: |
      grep -q CLOUDSDK_PYTHON /etc/environment || echo "CLOUDSDK_PYTHON=/usr/bin/python3" >> /etc/environment

      export HOME=/home/tpu-runtime
      curl -s 'http://metadata.google.internal/computeMetadata/v1/instance/attributes/tpu-env' -H 'Metadata-Flavor: Google' > /tmp/tpu-env.yaml

      eval $(python3 -c '''
      import yaml
      stream_in=open("/tmp/tpu-env.yaml", "r")
      for k,v in yaml.safe_load(stream_in).items():
        print("{var}=\"{value}\"".format(var = k, value = str(v)))
      ''' > "/${HOME}/tpu-env"
      )

      rm -f "/tmp/tpu-env.yaml"

      printenv
      cat ${HOME}/tpu-env

VM 메타데이터 가져오기

다음 스니펫은 /var/scripts/get-vm-metadata.py라는 스크립트를 만듭니다. 이 스크립트는 메타데이터 서버에서 특정 인스턴스 속성과 맞춤 메타데이터 태그를 프로그래매틱 방식으로 쿼리하는 Python 유틸리티입니다. cloud-init 구성의 write_files: 섹션에 다음을 추가합니다.

 - path: /var/scripts/get-vm-metadata.py
    permissions: 0444
    owner: root
    content: |
      import sys, requests, os

      if len(sys.argv) < 2:
        sys.stderr.write('Must provide key')
        os._exit(1)

      key = sys.argv[1]
      default = None
      if len(sys.argv) > 2:
        default = sys.argv[2]

      attribute_type = 'attributes'
      if len(sys.argv) > 3:
        attribute_type = sys.argv[3]

      request = requests.get("http://metadata.google.internal/computeMetadata/v1/instance/{}/{}".format(attribute_type, key), headers={'Metadata-Flavor': 'Google'})
      if request.status_code == 200:
        print(request.content)
      elif request.status_code == 404 or request.status_code == '403':
        sys.stderr.write('Metadata key: {} does not exist\n'.format(key))
        if default:
          print(default)
      else:
        sys.stderr.write('Lookup failed with: {}'.format(request))

Cloud Storage 제한 시간 늘리기

워크로드가 Cloud Storage와 상호작용하는 경우 /etc/environment에 제한 시간 값을 추가하여 제한 시간 기간을 늘립니다. 이렇게 하려면 cloud-init 구성의 write_files: 섹션에 다음 스니펫을 추가하여 /var/scripts/configure-gcs-timeouts.sh라는 스크립트를 만듭니다.

 - path: /var/scripts/configure-gcs-timeouts.sh
    permissions: 0444
    owner: root
    content: |
      echo "GCS_RESOLVE_REFRESH_SECS=60" >> /etc/environment
      echo "GCS_REQUEST_CONNECTION_TIMEOUT_SECS=300" >> /etc/environment
      echo "GCS_METADATA_REQUEST_TIMEOUT_SECS=300" >> /etc/environment
      echo "GCS_READ_REQUEST_TIMEOUT_SECS=300" >> /etc/environment
      echo "GCS_WRITE_REQUEST_TIMEOUT_SECS=600" >> /etc/environment

다음 단계