기본 제공 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
    

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

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

  1. 업데이트된 CUDA_REDIST_JSON_DICT를 사용하여 pull 요청을 만들고 제출합니다. 사전 CUDA_REDIST_JSON_DICTthird_party/gpus/cuda/hermetic/cuda_redist_versions.bzl.

    필요한 경우 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 dir을 재배포 소스로 사용할 수 있습니다. 다음과 같은 추가 환경 변수도 필요합니다.

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 dir 내부의 폴더 구조는 다음과 같아야 합니다 (보관처리된 재배포가 한 곳에 압축해제된 것처럼).

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

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

<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에 종속된 다운스트림 프로젝트에서 밀폐 cuda JSON을 업데이트합니다. WORKSPACE 파일의 저장소 호출 웹 링크와 로컬 파일 경로 모두 허용됩니다. 예:

    _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 배포

이 옵션을 사용하면 일부 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는 다음 위치에서 커스텀 JSON 데이터와 병합됩니다. _CUDA_JSON_DICT, 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의 경우 다음에서 --override_repository=local_tsl=<tsl_path> 플래그를 사용합니다. Bazel 명령어 옵션