작업 명세의 device 블록

작업 명세의 device 블록 (device block in the job specification)

배치 job -> group -> task -> resources -> **device**

device 블록은 주어진 태스크가 지정된 장치에 접근할 수 있어야 한다는 스케줄링 및 런타임 요구 사항을 모두 만들기 위해 사용돼요. 장치는 노드에 연결되고 태스크에 제공될 수 있는 하드웨어 장치예요. 예로는 GPU, FPGA, TPU가 있어요.

device 블록을 추가하면 Nomad는 지정된 요구 사항을 충족하는 장치 집합이 있는 노드에 태스크를 스케줄해요. device 블록은 운영자가 gpu 같은 장치 유형만 지정하는 최소한의 요구부터 임의의 constraint와 affinity를 지정하는 것까지 허용해요. 스케줄러가 적합한 노드에 할당을 배치하면 Nomad 클라이언트는 장치 플러그인을 호출해 장치를 마운트하는 방법과 노출할 환경 변수에 대한 정보를 검색해요. 런타임 환경에 대한 자세한 내용은 개별 장치 플러그인의 문서를 참조하세요.

지원되는 장치 목록은 장치 플러그인 문서를 참조하세요.

job "docs" {
  group "example" {
    task "server" {
      resources {
        device "nvidia/gpu" {
          count = 2

          constraint {
            attribute = "${device.attr.memory}"
            operator  = ">="
            value     = "2 GiB"
          }

          affinity {
            attribute = "${device.attr.memory}"
            operator  = ">="
            value     = "4 GiB"
            weight    = 75
          }
        }
      }
    }
  }
}

위 예제에서 태스크는 Nvidia 공급업체의 GPU 2개를 요청하지만 특정 모델은 지정하지 않아요. 대신 장치에 최소 2 GiB의 메모리가 있다는 하드 constraint를 배치하고 최소 4 GiB가 있는 GPU를 선호하는 affinity를 배치해요. 이 예제는 device 블록이 얼마나 표현력이 있는지 보여줘요.

장치 지원은 현재 Linux와 컨테이너 기반 드라이버로 제한돼요. 장치를 특정 태스크에 격리할 수 있기 때문이에요.

출처: 문서

본문

device 매개변수 (device Parameters)

  • name (string: "") — 필요한 장치를 지정해요. 다음 입력이 유효해요:

    • <device_type>: 단일 값이 주어지면 장치 유형("gpu"나 "fpga" 같은)으로 간주돼요.
    • <vendor>/<device_type>: /로 구분된 두 값이 주어지면 제공된 공급업체로 제약한 장치 유형이 선택돼요. 예: "nvidia/gpu" 또는 "amd/gpu".
    • <vendor>/<device_type>/<model>: /로 구분된 세 값이 주어지면 제공된 공급업체와 모델 이름으로 제약한 장치 유형이 선택돼요. 예: "nvidia/gpu/1080ti" 또는 "nvidia/gpu/2080ti".
  • count (int: 1) — 필요한 주어진 장치의 인스턴스 수를 지정해요.

  • constraint ([Constraint](https://developer.hashicorp.com/nomad/docs/job-specification/constraint "Nomad constraint Job Specification"): nil) — 어떤 장치가 적합한지 제한하는 제약 조건. 추가 제약 조건을 정의하기 위해 여러 번 제공할 수 있어요. 사용 가능한 속성은 아래를 참조하세요.

  • affinity ([Affinity](https://developer.hashicorp.com/nomad/docs/job-specification/affinity "Nomad affinity Job Specification"): nil) — 어떤 장치가 선택되는지에 대한 선호도를 지정하는 affinity. 추가 affinity를 정의하기 위해 여러 번 제공할 수 있어요. 사용 가능한 속성은 아래를 참조하세요.

device constraint 및 affinity 속성 (device Constraint and Affinity Attributes)

constraint 또는 affinity에서 사용할 수 있는 속성 집합은 다음과 같아요:

변수 설명 예제 값
${device.ids} 그룹의 장치 ID의 쉼표로 구분된 목록 9afa5da1-8f39-25a2-48dc-ba31fd7c0023,c248b547-fed7-4d67-ade5-73a27d280ac4
${device.type} 장치 유형 "gpu", "tpu", "fpga"
${device.vendor} 장치의 공급업체 "amd", "nvidia", "intel"
${device.model} 장치의 모델 "1080ti"
${device.attr.<property>} 장치의 속성 ${device.attr.memory} => 8 GiB

사용 가능한 속성 집합은 개별 장치 플러그인 문서를 참조하세요.

속성 단위 및 변환 (Attribute Units and Conversions)

장치는 엄격한 유형으로 속성을 보고하고 단위 정보도 제공할 수 있어요. 예를 들어 GPU가 메모리를 보고할 때 "4096 MiB"라고 보고할 수 있어요. Nomad는 관련 단위 정보를 가지므로, "3.5 GiB"보다 큰 것을 요구하는 constraint는 Nomad가 단위를 변환할 수 있어서 일치할 수 있어요.

Nomad가 지원하는 단위는 다음과 같아요:

기본 단위 값
Byte Base 2 : KiB, MiB, GiB, TiB, PiB, EiB
Base 10 : kB, KB(kB와 동일), MB, GB, TB, PB, EB
Byte Rates Base 2 : KiB/s, MiB/s, GiB/s, TiB/s, PiB/s, EiB/s
Base 10 : kB/s, KB/s(kB/s와 동일), MB/s, GB/s, TB/s, PB/s, EB/s
Hertz MHz, GHz
Watts mW, W, kW, MW, GW

변환은 같은 기본 단위 안에서만 가능해요.

device 예제 (device Examples)

다음 예제는 device 블록만 보여줘요. device 블록은 위에 나열된 배치에서만 유효하다는 것을 기억하세요.

단일 Nvidia GPU (Single Nvidia GPU)

이 예제는 단일 Nvidia GPU가 제공되는 태스크를 스케줄해요.

device "nvidia/gpu" {}

여러 Nvidia GPU (Multiple Nvidia GPU)

이 예제는 Nvidia GPU 2개가 제공되는 태스크를 스케줄해요.

device "nvidia/gpu" {
  count = 2
}

특정 모델이 있는 단일 Nvidia GPU (Single Nvidia GPU with Specific Model)

이 예제는 단일 Nvidia GPU가 제공되는 태스크를 스케줄하고 이름을 사용해 사용할 정확한 모델을 지정해요.

device "nvidia/gpu/1080ti" {}

이것은 다음의 단순화예요:

device "gpu" {
  count = 1

  constraint {
    attribute = "${device.vendor}"
    value     = "nvidia"
  }

  constraint {
    attribute = "${device.model}"
    value     = "1080ti"
  }
}

단위 변환이 있는 affinity (Affinity with Unit Conversion)

이 예제는 affinity를 사용해 GPU에 최소 1.5 GiB의 메모리가 있으면 좋겠다고 스케줄러에 알려요. Nomad가 단위 변환을 할 수 있으므로 다음 두 가지는 동일해요.

GiB로 지정:

device "nvidia/gpu" {
  affinity {
    attribute = "${device.attr.memory}"
    operator  = ">="
    value     = "1.5 GiB"
    weight    = 75
  }
}

MiB로 지정:

device "nvidia/gpu" {
  affinity {
    attribute = "${device.attr.memory}"
    operator  = ">="
    value     = "1500 MiB"
    weight    = 75
  }
}

특정 GPU 장치에 대한 affinity (Affinity Towards Specific GPU Devices)

이 예제는 affinity를 사용해 UUID를 선택 기준으로 특정 GPU 장치에 대한 스케줄링 선호를 나타내요. 장치는 그룹으로 지문인식되므로 여러 ID를 쉼표로 구분된 목록으로 지정할 수 있어요.

device "nvidia/gpu" {
  affinity {
    attribute = "${device.ids}"
    operator  = "set_contains"
    value     = "9afa5da1-8f39-25a2-48dc-ba31fd7c0023,c248b547-fed7-4d67-ade5-73a27d280ac4"
  }
}

더 알아보기 (Learn more)