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
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")
Hermetik CUDA ve CUDNN'nin belirli sürümlerini seçmek için sırasıyla
HERMETIC_CUDA_VERSION
veHERMETIC_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"
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.
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
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.Her Google ML projesi için
.bazelrc
dosyasında güncellenmişHERMETIC_CUDA_VERSION
veHERMETIC_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.
cuda_redist.json
ve/veyacudnn_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 vefile:///
ile başlayan mutlak yerel yollar içinfull_path
ile değiştirilebilir.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()
vecudnn_redist_init_repository()
çağrılarında yol ön eki güncellenmelidir. Örnekcuda_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.
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", )
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 vefile:///
ile başlayan mutlak yerel yollar içinfull_path
ile değiştirilebilir.Aynı
WORKSPACE
dosyasında, oluşturulan sözlükleri depo kuralına iletin. Sözlükler dağıtımlara göreli yollar içeriyorsacuda_redist_init_repositories()
vecudnn_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:
XLA'ya bağlı projenin
WORKSPACE
dosyasından hermetik CUDA depo kurallarına yapılan çağrıları silin.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")
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
veTF_CUDNN_VERSION
'ün yalnızca ana ve ara sürümlerden oluşması gerektiğini unutmayın (ör. CUDA için12.3
ve CUDNN için9.1
).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.