Hermetik CUDA'ya genel bakış

Hermetic CUDA, kullanıcının yerel olarak yüklenmiş CUDA'sı yerine CUDA'nın indirilebilir belirli bir sürümünü kullanır. Bazel, CUDA, CUDNN ve NCCL dağıtımlarını indirir ve ardından CUDA kitaplıklarını ve araçlarını çeşitli Bazel hedeflerinde bağımlılık olarak kullanır. Bu, Google ML projeleri ve desteklenen CUDA sürümleri için daha yeniden oluşturulabilir derlemeler sağlar.

Desteklenen hermetik CUDA, CUDNN sürümleri

Desteklenen CUDA sürümleri CUDA_REDIST_JSON_DICT sözlükte, third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl adresinde belirtilmiştir.

Desteklenen CUDNN sürümleri CUDNN_REDIST_JSON_DICT sözlükte, third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl dosyasında belirtilir.

Projelerin .bazelrc dosyalarında HERMETIC_CUDA_VERSION, HERMETIC_CUDNN_VERSION ortam değişkenleri, Bazel komut seçeneklerinde --config=cuda belirtildiğinde varsayılan olarak kullanılan sürümlere ayarlanır.

Hermetik CUDA/CUDNN sürümlerini kontrol eden ortam değişkenleri

HERMETIC_CUDA_VERSION ortam değişkeni, büyük, küçük ve yama CUDA sürümünden oluşmalıdır (ör. 12.3.2). HERMETIC_CUDNN_VERSION ortam değişkeni, ana, alt ve yama CUDNN sürümünden oluşmalıdır (ör. 9.1.1).

Bazel komutları için ortam değişkenlerini ayarlamayla ilgili üç yöntem:

# 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_VERSION ve HERMETIC_CUDNN_VERSION mevcut değilse hermetik CUDA/CUDNN depo kuralları TF_CUDA_VERSION ve TF_CUDNN_VERSION ortam değişkeni değerlerini arar. Bu, hermetik olmayan CUDA/CUDNN kod deposu kurallarıyla geriye dönük uyumluluk sağlamak için yapılmıştır.

İndirilecek CUDA sürümü ile NCCL dağıtım sürümü arasındaki eşleme, third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl adresinde belirtilmiştir.

Hermetik CUDA'yı yapılandırma

  1. XLA'ya bağlı alt akış projesinde, WORKSPACE dosyasının alt kısmına aşağıdaki satırları ekleyin:

    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. Hermetik CUDA ve CUDNN'nin belirli sürümlerini seçmek için sırasıyla HERMETIC_CUDA_VERSION ve HERMETIC_CUDNN_VERSION ortam değişkenlerini ayarlayın. Yalnızca desteklenen sürümleri kullanın. Ortam değişkenlerini doğrudan kabuğunuzda veya .bazelrc dosyasında aşağıda gösterildiği gibi ayarlayabilirsiniz:

    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. Test yürütme sırasında veya bazel üzerinden ikili program çalıştırırken hermetik CUDA'yı etkinleştirmek için bazel komutunuza --@local_config_cuda//cuda:include_cuda_libs=true işaretini eklediğinizden emin olun. Bu değeri doğrudan bir kabukta veya .bazelrc içinde sağlayabilirsiniz:

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

    Yürütülebilir dosyaları test etmek için CUDA bağımlılıkları düzgün şekilde sağlandığından emin olmak amacıyla bu işaret gereklidir. Google tarafından yayınlanan Python tekerleklerinin CUDA ikili programlarıyla istenmeyen şekilde birleştirilmesini önlemek için işaret varsayılan olarak false'tur.

  4. CUDA ileriye dönük uyumluluk modunu zorunlu kılmak için bazel komutunuza --@cuda_driver//:enable_forward_compatibility=true işaretini ekleyin. Doğrudan bir kabukta veya .bazelrc içinde sağlayabilirsiniz:

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

    Varsayılan işaret değeri false'tür.

    CUDA ileri uyumluluk modu devre dışı bırakıldığında Bazel hedefleri, sisteme önceden yüklenmiş kullanıcı modu ve çekirdek modu sürücülerini kullanır.

    CUDA ileri uyumluluk modu etkinleştirildiğinde Bazel hedefleri, Bazel önbelleği içine indirilen CUDA sürücü yeniden dağıtımından UserMode Driver'ı ve sisteme önceden yüklenmiş KernelModeDriver'ı kullanır. Eski çekirdek modu sürücüsünü kullanırken yeni CUDA araç seti özelliklerinin etkinleştirilmesine olanak tanır.

    İleriye dönük uyumluluk modu yalnızca uygun olduğunda uygulanmalıdır. Ayrıntılar için NVIDIA dokümanlarına bakın.

Hermetik CUDA/CUDNN sürümünü yükseltme

  1. third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl dosyasında güncellenmiş CUDA_REDIST_JSON_DICT, CUDA_REDIST_JSON_DICT sözlükleriyle bir çekme isteği oluşturun ve gönderin.

    Gerekirse third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl dosyasında CUDA_NCCL_WHEELS değerini güncelleyin.

    Gerekirse third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl dosyasında REDIST_VERSIONS_TO_BUILD_TEMPLATES değerini güncelleyin.

  2. Her Google ML projesi için .bazelrc dosyasında güncellenmiş HERMETIC_CUDA_VERSION ve HERMETIC_CUDNN_VERSION içeren ayrı bir çekme isteği oluşturun.

    PR göndermeden önce iş yürütme işlemleri, bazel testlerini başlatır ve hermetik CUDA/CUDNN dağıtımlarını indirir. PR'yi göndermeden önce ön gönderim işlerinin başarılı olduğunu doğrulayın.

Yerel dosya sisteminde CUDA/CUDNN/NCCL yeniden dağıtımlarını işaretleme

Yeniden dağıtım kaynağı olarak yerel CUDA/CUDNN/NCCL dizinlerini kullanabilirsiniz. Aşağıdaki ek ortam değişkenleri gereklidir:

LOCAL_CUDA_PATH
LOCAL_CUDNN_PATH
LOCAL_NCCL_PATH

Örnek:

# 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 dizinindeki klasörlerin yapısı aşağıdaki gibi olmalıdır (arşivlenmiş yeniden dağıtımlar tek bir yerde açılmış gibi):

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

CUDNN dizinindeki klasörlerin yapısı aşağıdaki gibi olmalıdır:

<LOCAL_CUDNN_PATH>
    include/
    lib/

NCCL dizinindeki klasörlerin yapısı aşağıdaki gibi olmalıdır:

<LOCAL_NCCL_PATH>
    include/
    lib/

Özel CUDA/CUDNN arşivleri ve NCCL tekerlekleri

Özel CUDA/CUDNN dağıtımlarının kullanılmasına olanak tanıyan üç seçenek vardır.

Özel CUDA/CUDNN yeniden dağıtım JSON dosyaları

Bu seçenek, Google ML projelerindeki tüm CUDA/CUDNN bağımlılıkları için özel dağıtımları kullanmanıza olanak tanır.

  1. cuda_redist.json ve/veya cudnn_redist.json dosyaları oluşturun.

    cuda_redist.json show aşağıdaki biçimi kullanır:

    {
       "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 show aşağıdaki biçimi kullanır:

    {
       "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",
             }
          }
       }
    }
    

    relative_path alanı, tam URL'ler ve file:/// ile başlayan mutlak yerel yollar için full_path ile değiştirilebilir.

  2. XLA'ya bağlı olan yayın sonrası projede, WORKSPACE dosyasında hermetik cuda JSON deposu çağrısını güncelleyin. Hem web bağlantılarına hem de yerel dosya yollarına izin verilir. Örnek:

    _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 dosyaları dağıtımlara göreli yollar içeriyorsa cuda_redist_init_repositories() ve cudnn_redist_init_repository() çağrılarında yol ön eki güncellenmelidir. Örnek

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

Özel CUDA/CUDNN dağıtımları

Bu seçenek, Google ML projelerinde bazı CUDA/CUDNN bağımlılıkları için özel dağıtımların kullanılmasına olanak tanır.

  1. XLA'ya bağlı olan yayın sonrası projede aşağıdaki satırları kaldırın:

    <...>
       "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. Aynı WORKSPACE dosyasında, dağıtım yolları içeren sözlükler oluşturun.

    CUDA dağıtımlarını içeren sözlük aşağıdaki biçimi izler:

    _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 dağıtımlarını içeren sözlük aşağıdaki biçimi izler:

    _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",
             }
          }
       }
    }
    

    relative_path alanı, tam URL'ler ve file:/// ile başlayan mutlak yerel yollar için full_path ile değiştirilebilir.

  3. Aynı WORKSPACE dosyasında, oluşturulan sözlükleri depo kuralına iletin. Sözlükler dağıtımlara göreli yollar içeriyorsa cuda_redist_init_repositories() ve cudnn_redist_init_repository() çağrılarında yol ön eki güncellenmelidir.

    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/"
    )
    

    Yukarıdaki seçeneklerin bir kombinasyonu

Aşağıdaki örnekte, CUDA_REDIST_JSON_DICT, _CUDA_JSON_DICT'daki özel JSON verileriyle ve CUDNN_REDIST_JSON_DICT, _CUDNN_JSON_DICT ile birleştirilmiştir.

_CUDA_DIST_DICT içindeki dağıtım verileri, oluşturulan CUDA JSON dosyasının içeriğini geçersiz kılar ve _CUDNN_DIST_DICT içindeki dağıtım verileri, oluşturulan CUDNN JSON dosyasının içeriğini geçersiz kılar. NCCL Wheels verileri CUDA_NCCL_WHEELS ve _NCCL_WHEEL_DICT verileri birleştirilir.

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,
)

DEĞMELİ: Hermetik olmayan CUDA/CUDNN kullanımı

Hermetik olmayan CUDA/CUDNN kullanımının desteği sonlandırılmış olsa da şu anda resmi olarak desteklenmeyen bazı denemeler için kullanılabilir (örneğin, CUDA ile Windows'ta tekerlekler oluşturma).

Google ML projelerinde yerel olarak yüklenmiş hermetik olmayan CUDA'yı kullanmak için şu adımları uygulayın:

  1. XLA'ya bağlı projenin WORKSPACE dosyasından hermetik CUDA depo kurallarına yapılan çağrıları silin.

  2. Hermetik olmayan CUDA depo kuralları çağrılarını WORKSPACE dosyasının alt kısmına ekleyin.

    XLA ve JAX için:

    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 için:

    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. Aşağıda gösterildiği gibi aşağıdaki ortam değişkenlerini doğrudan kabuğunuzda veya .bazelrc dosyasında ayarlayın:

    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_VERSION ve TF_CUDNN_VERSION'ün yalnızca ana ve ara sürümlerden oluşması gerektiğini unutmayın (ör. CUDA için 12.3 ve CUDNN için 9.1).

  4. Artık yerel olarak yüklü CUDA ve CUDNN'yi kullanmak için bazel komutunu çalıştırabilirsiniz.

    XLA için komut seçeneklerinde değişiklik yapılması gerekmez.

    JAX için Bazel komut seçeneklerinde --override_repository=tsl=<tsl_path> işaretini kullanın.

    Tensorflow için Bazel komut seçeneklerinde --override_repository=local_tsl=<tsl_path> işaretini kullanın.