기본 제공 CUDA 개요

밀폐 CUDA는 사용자의 로컬에 설치된 CUDA 대신 다운로드 가능한 특정 버전의 CUDA를 사용합니다. Bazel은 CUDA, CUDNN, NCCL 배포를 다운로드한 후 CUDA 라이브러리와 도구를 다양한 Bazel 대상의 종속 항목으로 사용합니다. 이를 통해 Google ML 프로젝트와 지원되는 CUDA 버전의 재현 가능한 빌드가 더 많이 가능해집니다.

지원되는 격리된 CUDA, CUDNN 버전

지원되는 CUDA 버전은 CUDA_REDIST_JSON_DICT 사전인 third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl에 지정됩니다.

지원되는 CUDNN 버전은 CUDNN_REDIST_JSON_DICT 사전(third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl)에 지정됩니다.

개별 프로젝트의 .bazelrc 파일에는 HERMETIC_CUDA_VERSION, HERMETIC_CUDNN_VERSION 환경 변수가 Bazel 명령어 옵션에 --config=cuda가 지정될 때 기본적으로 사용되는 버전으로 설정되어 있습니다.

견고한 CUDA/CUDNN 버전을 제어하는 환경 변수

HERMETIC_CUDA_VERSION 환경 변수는 메이저, 마이너, 패치 CUDA 버전(예: 12.3.2)으로 구성되어야 합니다. HERMETIC_CUDNN_VERSION 환경 변수는 주, 부, 패치 CUDNN 버전(예: 9.1.1)으로 구성되어야 합니다.

Bazel 명령어의 환경 변수를 설정하는 세 가지 방법은 다음과 같습니다.

# Add an entry to your `.bazelrc` file
build:cuda --repo_env=HERMETIC_CUDA_VERSION="12.3.2"
build:cuda --repo_env=HERMETIC_CUDNN_VERSION="9.1.1"

# OR pass it directly to your specific build command
bazel build --config=cuda <target> \
--repo_env=HERMETIC_CUDA_VERSION="12.3.2" \
--repo_env=HERMETIC_CUDNN_VERSION="9.1.1"

# If .bazelrc doesn't have corresponding entries and the environment variables
# are not passed to bazel command, you can set them globally in your shell:
export HERMETIC_CUDA_VERSION="12.3.2"
export HERMETIC_CUDNN_VERSION="9.1.1"

HERMETIC_CUDA_VERSIONHERMETIC_CUDNN_VERSION가 없으면 견고한 CUDA/CUDNN 저장소 규칙이 TF_CUDA_VERSIONTF_CUDNN_VERSION 환경 변수 값을 조회합니다. 이는 비밀 유지가 불가능한 CUDA/CUDNN 저장소 규칙과의 하위 호환성을 위해 만들어졌습니다.

다운로드할 CUDA 버전과 NCCL 배포 버전 간의 매핑은 third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl에 지정됩니다.

견고한 CUDA 구성

  1. XLA에 종속된 다운스트림 프로젝트에서 WORKSPACE 파일 하단에 다음 줄을 추가합니다.

    load(
       "@tsl//third_party/gpus/cuda/hermetic:cuda_json_init_repository.bzl",
       "cuda_json_init_repository",
    )
    
    cuda_json_init_repository()
    
    load(
       "@cuda_redist_json//:distributions.bzl",
       "CUDA_REDISTRIBUTIONS",
       "CUDNN_REDISTRIBUTIONS",
    )
    load(
       "@tsl//third_party/gpus/cuda/hermetic:cuda_redist_init_repositories.bzl",
       "cuda_redist_init_repositories",
       "cudnn_redist_init_repository",
    )
    
    cuda_redist_init_repositories(
       cuda_redistributions = CUDA_REDISTRIBUTIONS,
    )
    
    cudnn_redist_init_repository(
       cudnn_redistributions = CUDNN_REDISTRIBUTIONS,
    )
    
    load(
       "@tsl//third_party/gpus/cuda/hermetic:cuda_configure.bzl",
       "cuda_configure",
    )
    
    cuda_configure(name = "local_config_cuda")
    
    load(
       "@tsl//third_party/nccl/hermetic:nccl_redist_init_repository.bzl",
       "nccl_redist_init_repository",
    )
    
    nccl_redist_init_repository()
    
    load(
       "@tsl//third_party/nccl/hermetic:nccl_configure.bzl",
       "nccl_configure",
    )
    
    nccl_configure(name = "local_config_nccl")
    
  2. 격리된 CUDA 및 CUDNN의 특정 버전을 선택하려면 각각 HERMETIC_CUDA_VERSIONHERMETIC_CUDNN_VERSION 환경 변수를 설정합니다. 지원되는 버전만 사용하세요. 아래와 같이 셸 또는 .bazelrc 파일에서 직접 환경 변수를 설정할 수 있습니다.

    build:cuda --repo_env=HERMETIC_CUDA_VERSION="12.3.2"
    build:cuda --repo_env=HERMETIC_CUDNN_VERSION="9.1.1"
    build:cuda --repo_env=HERMETIC_CUDA_COMPUTE_CAPABILITIES="sm_50,sm_60,sm_70,sm_80,compute_90"
    
  3. 테스트 실행 중에 또는 bazel을 통해 바이너리를 실행할 때 기본 제공 CUDA를 사용 설정하려면 bazel 명령어에 --@local_config_cuda//cuda:include_cuda_libs=true 플래그를 추가해야 합니다. 셸에서 직접 또는 .bazelrc에서 제공할 수 있습니다.

    build:cuda --@local_config_cuda//cuda:include_cuda_libs=true
    

    이 플래그는 실행 파일을 테스트하는 데 CUDA 종속 항목이 올바르게 제공되는지 확인하는 데 필요합니다. Google에서 출시한 Python 휠이 CUDA 바이너리에 원치 않게 결합되지 않도록 이 플래그는 기본적으로 false입니다.

  4. CUDA 향후 버전과의 호환성 모드를 적용하려면 bazel 명령어에 --@cuda_driver//:enable_forward_compatibility=true 플래그를 추가합니다. 셸에서 직접 또는 .bazelrc에서 제공할 수 있습니다.

    test:cuda --@cuda_driver//:enable_forward_compatibility=true
    

    기본 플래그 값은 false입니다.

    CUDA 전방 호환성 모드가 사용 중지되면 Bazel 타겟은 시스템에 사전 설치된 사용자 모드 및 커널 모드 드라이버를 사용합니다.

    CUDA 전방 호환성 모드가 사용 설정되면 Bazel 타겟은 Bazel 캐시로 다운로드된 CUDA 드라이버 재배포의 사용자 모드 드라이버와 시스템에 사전 설치된 커널 모드 드라이버를 사용합니다. 이를 통해 이전 커널 모드 드라이버를 사용하는 동안 새 CUDA 도구 키트 기능을 사용 설정할 수 있습니다.

    앞으로의 호환성 모드는 적절한 경우에만 적용해야 합니다. 자세한 내용은 NVIDIA 문서를 참고하세요.

견고한 CUDA/CUDNN 버전 업그레이드

  1. third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl의 업데이트된 CUDA_REDIST_JSON_DICT, CUDA_REDIST_JSON_DICT 사전으로 pull 요청을 만들고 제출합니다.

    필요한 경우 third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl에서 CUDA_NCCL_WHEELS를 업데이트합니다.

    필요한 경우 third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl에서 REDIST_VERSIONS_TO_BUILD_TEMPLATES를 업데이트합니다.

  2. 각 Google ML 프로젝트의 경우 .bazelrc 파일에 업데이트된 HERMETIC_CUDA_VERSIONHERMETIC_CUDNN_VERSION가 포함된 별도의 풀 리퀘스트를 만듭니다.

    PR 사전 제출 작업 실행은 bazel 테스트를 실행하고 격리된 CUDA/CUDNN 배포를 다운로드합니다. PR을 제출하기 전에 사전 제출 작업이 통과했는지 확인합니다.

로컬 파일 시스템에서 CUDA/CUDNN/NCCL 재배포를 가리킴

로컬 CUDA/CUDNN/NCCL 디렉터리를 재배포 소스로 사용할 수 있습니다. 다음과 같은 추가 환경 변수가 필요합니다.

LOCAL_CUDA_PATH
LOCAL_CUDNN_PATH
LOCAL_NCCL_PATH

예:

# Add an entry to your `.bazelrc` file
build:cuda --repo_env=LOCAL_CUDA_PATH="/foo/bar/nvidia/cuda"
build:cuda --repo_env=LOCAL_CUDNN_PATH="/foo/bar/nvidia/cudnn"
build:cuda --repo_env=LOCAL_NCCL_PATH="/foo/bar/nvidia/nccl"

# OR pass it directly to your specific build command
bazel build --config=cuda <target> \
--repo_env=LOCAL_CUDA_PATH="/foo/bar/nvidia/cuda" \
--repo_env=LOCAL_CUDNN_PATH="/foo/bar/nvidia/cudnn" \
--repo_env=LOCAL_NCCL_PATH="/foo/bar/nvidia/nccl"

# If .bazelrc doesn't have corresponding entries and the environment variables
# are not passed to bazel command, you can set them globally in your shell:
export LOCAL_CUDA_PATH="/foo/bar/nvidia/cuda"
export LOCAL_CUDNN_PATH="/foo/bar/nvidia/cudnn"
export LOCAL_NCCL_PATH="/foo/bar/nvidia/nccl"

CUDA 디렉터리 내 폴더의 구조는 다음과 같아야 합니다(아카이브된 재배포가 한곳으로 압축 해제된 것처럼).

<LOCAL_CUDA_PATH>/
    include/
    bin/
    lib/
    nvvm/

CUDNN 디렉터리 내 폴더의 구조는 다음과 같아야 합니다.

<LOCAL_CUDNN_PATH>
    include/
    lib/

NCCL dir 내 폴더의 구조는 다음과 같아야 합니다.

<LOCAL_NCCL_PATH>
    include/
    lib/

맞춤 CUDA/CUDNN 보관 파일 및 NCCL 휠

맞춤 CUDA/CUDNN 배포를 사용할 수 있는 옵션에는 세 가지가 있습니다.

맞춤 CUDA/CUDNN 재배포 JSON 파일

이 옵션을 사용하면 Google ML 프로젝트의 모든 CUDA/CUDNN 종속 항목에 맞춤 배포를 사용할 수 있습니다.

  1. cuda_redist.json 또는 cudnn_redist.json 파일을 만듭니다.

    cuda_redist.json 표시는 다음 형식을 따릅니다.

    {
       "cuda_cccl": {
          "linux-x86_64": {
             "relative_path": "cuda_cccl-linux-x86_64-12.4.99-archive.tar.xz",
          },
          "linux-sbsa": {
             "relative_path": "cuda_cccl-linux-sbsa-12.4.99-archive.tar.xz",
          }
       },
    }
    

    cudnn_redist.json 표시는 다음 형식을 따릅니다.

    {
       "cudnn": {
          "linux-x86_64": {
             "cuda12": {
             "relative_path": "cudnn/linux-x86_64/cudnn-linux-x86_64-9.0.0.312_cuda12-archive.tar.xz",
             }
          },
          "linux-sbsa": {
             "cuda12": {
             "relative_path": "cudnn/linux-sbsa/cudnn-linux-sbsa-9.0.0.312_cuda12-archive.tar.xz",
             }
          }
       }
    }
    

    전체 URL 및 file:///로 시작하는 절대 로컬 경로의 경우 relative_path 필드를 full_path로 바꿀 수 있습니다.

  2. XLA에 종속된 다운스트림 프로젝트에서 WORKSPACE 파일의 견고한 cuda JSON 저장소 호출을 업데이트합니다. 웹 링크와 로컬 파일 경로가 모두 허용됩니다. 예:

    _CUDA_JSON_DICT = {
       "12.4.0": [
          "file:///home/user/Downloads/redistrib_12.4.0_updated.json",
       ],
    }
    
    _CUDNN_JSON_DICT = {
       "9.0.0": [
          "https://developer.download.nvidia.com/compute/cudnn/redist/redistrib_9.0.0.json",
       ],
    }
    
    cuda_json_init_repository(
       cuda_json_dict = _CUDA_JSON_DICT,
       cudnn_json_dict = _CUDNN_JSON_DICT,
    )
    

    JSON 파일에 배포의 상대 경로가 포함된 경우 cuda_redist_init_repositories()cudnn_redist_init_repository() 호출에서 경로 접두사를 업데이트해야 합니다. 예

    cuda_redist_init_repositories(
       cuda_redistributions = CUDA_REDISTRIBUTIONS,
       cuda_redist_path_prefix = "file:///usr/Downloads/dists/",
    )
    

맞춤 CUDA/CUDNN 배포

이 옵션을 사용하면 Google ML 프로젝트에서 일부 CUDA/CUDNN 종속 항목에 커스텀 분포를 사용할 수 있습니다.

  1. XLA에 종속된 다운스트림 프로젝트에서 아래 줄을 삭제합니다.

    <...>
       "CUDA_REDIST_JSON_DICT",
    <...>
       "CUDNN_REDIST_JSON_DICT",
    <...>
    
    cuda_json_init_repository(
       cuda_json_dict = CUDA_REDIST_JSON_DICT,
       cudnn_json_dict = CUDNN_REDIST_JSON_DICT,
    )
    
    load(
       "@cuda_redist_json//:distributions.bzl",
       "CUDA_REDISTRIBUTIONS",
       "CUDNN_REDISTRIBUTIONS",
    )
    
  2. 동일한 WORKSPACE 파일에서 배포 경로가 포함된 사전을 만듭니다.

    CUDA 배포판이 포함된 사전은 다음 형식을 따릅니다.

    _CUSTOM_CUDA_REDISTRIBUTIONS = {
       "cuda_cccl": {
          "linux-x86_64": {
             "relative_path": "cuda_cccl-linux-x86_64-12.4.99-archive.tar.xz",
          },
          "linux-sbsa": {
             "relative_path": "cuda_cccl-linux-sbsa-12.4.99-archive.tar.xz",
          }
       },
    }
    

    CUDNN 분포가 포함된 사전은 다음 형식을 따릅니다.

    _CUSTOM_CUDNN_REDISTRIBUTIONS = {
       "cudnn": {
          "linux-x86_64": {
             "cuda12": {
             "relative_path": "cudnn/linux-x86_64/cudnn-linux-x86_64-9.0.0.312_cuda12-archive.tar.xz",
             }
          },
          "linux-sbsa": {
             "cuda12": {
             "relative_path": "cudnn/linux-sbsa/cudnn-linux-sbsa-9.0.0.312_cuda12-archive.tar.xz",
             }
          }
       }
    }
    

    전체 URL 및 file:///로 시작하는 절대 로컬 경로의 경우 relative_path 필드를 full_path로 바꿀 수 있습니다.

  3. 동일한 WORKSPACE 파일에서 생성된 사전을 저장소 규칙에 전달합니다. 사전에 배포의 상대 경로가 포함된 경우 cuda_redist_init_repositories()cudnn_redist_init_repository() 호출에서 경로 접두사를 업데이트해야 합니다.

    cuda_redist_init_repositories(
       cuda_redistributions = _CUSTOM_CUDA_REDISTRIBUTIONS,
       cuda_redist_path_prefix = "file:///home/usr/Downloads/dists/",
    )
    
    cudnn_redist_init_repository(
       cudnn_redistributions = _CUSTOM_CUDNN_REDISTRIBUTIONS,
       cudnn_redist_path_prefix = "file:///home/usr/Downloads/dists/cudnn/"
    )
    

    위 옵션 조합

아래 예에서 CUDA_REDIST_JSON_DICT_CUDA_JSON_DICT의 커스텀 JSON 데이터와 병합되고 CUDNN_REDIST_JSON_DICT_CUDNN_JSON_DICT와 병합됩니다.

_CUDA_DIST_DICT의 분포 데이터는 결과 CUDA JSON 파일의 콘텐츠를 재정의하고 _CUDNN_DIST_DICT의 분포 데이터는 결과 CUDNN JSON 파일의 콘텐츠를 재정의합니다. NCCL 휠 데이터는 CUDA_NCCL_WHEELS_NCCL_WHEEL_DICT에서 병합됩니다.

load(
    //third_party/gpus/cuda/hermetic:cuda_redist_versions.bzl",
    "CUDA_REDIST_PATH_PREFIX",
    "CUDA_NCCL_WHEELS",
    "CUDA_REDIST_JSON_DICT",
    "CUDNN_REDIST_PATH_PREFIX",
    "CUDNN_REDIST_JSON_DICT",
)

_CUDA_JSON_DICT = {
   "12.4.0": [
      "file:///usr/Downloads/redistrib_12.4.0_updated.json",
   ],
}

_CUDNN_JSON_DICT = {
   "9.0.0": [
      "https://developer.download.nvidia.com/compute/cudnn/redist/redistrib_9.0.0.json",
   ],
}

cuda_json_init_repository(
   cuda_json_dict = CUDA_REDIST_JSON_DICT | _CUDA_JSON_DICT,
   cudnn_json_dict = CUDNN_REDIST_JSON_DICT | _CUDNN_JSON_DICT,
)

load(
   "@cuda_redist_json//:distributions.bzl",
   "CUDA_REDISTRIBUTIONS",
   "CUDNN_REDISTRIBUTIONS",
)

load(
   "//third_party/gpus/cuda/hermetic:cuda_redist_init_repositories.bzl",
   "cuda_redist_init_repositories",
   "cudnn_redist_init_repository",
)

_CUDA_DIST_DICT = {
   "cuda_cccl": {
      "linux-x86_64": {
            "relative_path": "cuda_cccl-linux-x86_64-12.4.99-archive.tar.xz",
      },
      "linux-sbsa": {
            "relative_path": "cuda_cccl-linux-sbsa-12.4.99-archive.tar.xz",
      },
   },
   "libcusolver": {
      "linux-x86_64": {
            "full_path": "file:///usr/Downloads/dists/libcusolver-linux-x86_64-11.6.0.99-archive.tar.xz",
      },
      "linux-sbsa": {
         "relative_path": "libcusolver-linux-sbsa-11.6.0.99-archive.tar.xz",
      },
   },
}

_CUDNN_DIST_DICT = {
   "cudnn": {
      "linux-x86_64": {
            "cuda12": {
               "relative_path": "cudnn-linux-x86_64-9.0.0.312_cuda12-archive.tar.xz",
            },
      },
      "linux-sbsa": {
            "cuda12": {
               "relative_path": "cudnn-linux-sbsa-9.0.0.312_cuda12-archive.tar.xz",
            },
      },
   },
}

cudnn_redist_init_repositories(
   cuda_redistributions = CUDA_REDISTRIBUTIONS | _CUDA_DIST_DICT,
   cuda_redist_path_prefix = "file:///usr/Downloads/dists/",
)

cudnn_redist_init_repository(
   cudnn_redistributions = CUDNN_REDISTRIBUTIONS | _CUDNN_DIST_DICT,
   cudnn_redist_path_prefix = "file:///usr/Downloads/dists/cudnn/"
)

load(
    "//third_party/nccl/hermetic:nccl_redist_init_repository.bzl",
    "nccl_redist_init_repository",
)

_NCCL_WHEEL_DICT = {
   "12.4.0": {
      "x86_64-unknown-linux-gnu": {
            "url": "https://files.pythonhosted.org/packages/38/00/d0d4e48aef772ad5aebcf70b73028f88db6e5640b36c38e90445b7a57c45/nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl",
      },
   },
}

nccl_redist_init_repository(
   cuda_nccl_wheels = CUDA_NCCL_WHEELS | _NCCL_WHEEL_DICT,
)

지원 중단됨: 비밀 유지되지 않는 CUDA/CUDNN 사용

비밀 유지가 적용되지 않는 CUDA/CUDNN 사용은 지원 중단되었지만 현재 공식적으로 지원되지 않는 일부 실험(예: CUDA를 사용하여 Windows에서 휠 빌드)에는 사용할 수 있습니다.

다음은 Google ML 프로젝트에 로컬로 설치된 비밀 유지가 불가능한 CUDA를 사용하는 단계입니다.

  1. XLA에 종속된 프로젝트의 WORKSPACE 파일에서 격리된 CUDA 저장소 규칙 호출을 삭제합니다.

  2. WORKSPACE 파일 하단에 비밀 유지 되지 않는 CUDA 저장소 규칙 호출을 추가합니다.

    XLA 및 JAX의 경우:

    load("@tsl//third_party/gpus:cuda_configure.bzl", "cuda_configure")
    cuda_configure(name = "local_config_cuda")
    load("@tsl//third_party/nccl:nccl_configure.bzl", "nccl_configure")
    nccl_configure(name = "local_config_nccl")
    

    TensorFlow의 경우:

    load("@local_tsl//third_party/gpus:cuda_configure.bzl", "cuda_configure")
    cuda_configure(name = "local_config_cuda")
    load("@local_tsl//third_party/nccl:nccl_configure.bzl", "nccl_configure")
    nccl_configure(name = "local_config_nccl")
    
  3. 아래와 같이 셸 또는 .bazelrc 파일에서 다음 환경 변수를 직접 설정합니다.

    build:cuda --action_env=TF_CUDA_VERSION=<locally installed cuda version>
    build:cuda --action_env=TF_CUDNN_VERSION=<locally installed cudnn version>
    build:cuda --action_env=TF_CUDA_COMPUTE_CAPABILITIES=<CUDA compute capabilities>
    build:cuda --action_env=LD_LIBRARY_PATH=<CUDA/CUDNN libraries folder locations divided by : sign>
    build:cuda --action_env=CUDA_TOOLKIT_PATH=<preinstalled CUDA folder location>
    build:cuda --action_env=TF_CUDA_PATHS=<preinstalled CUDA/CUDNN folder locations divided by , sign>
    build:cuda --action_env=NCCL_INSTALL_PATH=<preinstalled NCCL library folder location>
    

    TF_CUDA_VERSIONTF_CUDNN_VERSION는 주 버전과 부 버전으로만 구성되어야 합니다 (예: CUDA의 경우 12.3, CUDNN의 경우 9.1).

  4. 이제 bazel 명령어를 실행하여 로컬에 설치된 CUDA 및 CUDNN을 사용할 수 있습니다.

    XLA의 경우 명령어 옵션을 변경할 필요가 없습니다.

    JAX의 경우 Bazel 명령어 옵션에 --override_repository=tsl=<tsl_path> 플래그를 사용합니다.

    Tensorflow의 경우 Bazel 명령어 옵션에서 --override_repository=local_tsl=<tsl_path> 플래그를 사용합니다.