هرمتیک 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
هستند که بهطور پیشفرض روی نسخههایی که --config=cuda
در گزینههای فرمان Bazel مشخص شده است، استفاده میشوند.
متغیرهای محیطی که نسخههای هرمتیک 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_VERSION
و HERMETIC_CUDNN_VERSION
وجود نداشته باشند، قوانین مخزن هرمتیک CUDA/CUDNN مقادیر متغیرهای محیطی TF_CUDA_VERSION
و TF_CUDNN_VERSION
را جستجو می کنند. این برای سازگاری عقب با قوانین مخزن CUDA/CUDNN غیرهرمتیک ساخته شده است.
نقشه برداری بین نسخه CUDA و نسخه توزیع NCCL که باید دانلود شود در third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl مشخص شده است.
هرمتیک CUDA را پیکربندی کنید
در پروژه پایین دستی وابسته به XLA، خطوط زیر را به پایین فایل
WORKSPACE
اضافه کنید:load( "@xla//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( "@xla//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( "@xla//third_party/gpus/cuda/hermetic:cuda_configure.bzl", "cuda_configure", ) cuda_configure(name = "local_config_cuda") load( "@xla//third_party/nccl/hermetic:nccl_redist_init_repository.bzl", "nccl_redist_init_repository", ) nccl_redist_init_repository() load( "@xla//third_party/nccl/hermetic:nccl_configure.bzl", "nccl_configure", ) nccl_configure(name = "local_config_nccl")
برای انتخاب نسخههای خاص هرمتیک CUDA و CUDNN، به ترتیب متغیرهای محیطی
HERMETIC_CUDA_VERSION
وHERMETIC_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"
برای فعال کردن CUDA هرمتیک در حین اجرای آزمایش، یا هنگام اجرای یک باینری از طریق bazel، مطمئن شوید که
--@local_config_cuda//cuda:include_cuda_libs=true
را به دستور bazel خود اضافه کنید. می توانید آن را مستقیماً در یک پوسته یا در.bazelrc
ارائه کنید:build:cuda --@local_config_cuda//cuda:include_cuda_libs=true
این پرچم برای اطمینان از اینکه وابستگیهای CUDA به درستی برای آزمایشهای اجرایی ارائه شده است مورد نیاز است. این پرچم به طور پیشفرض نادرست است تا از جفت شدن ناخواسته چرخهای پایتون منتشر شده توسط Google با باینریهای CUDA جلوگیری شود.
برای اعمال حالت سازگاری فوروارد CUDA،
--@cuda_driver//:enable_forward_compatibility=true
flag را به دستور bazel خود اضافه کنید. می توانید آن را مستقیماً در یک پوسته یا در.bazelrc
ارائه کنید:test:cuda --@cuda_driver//:enable_forward_compatibility=true
مقدار پرچم پیش فرض
false
است.وقتی حالت سازگاری فوروارد CUDA غیرفعال است، اهداف Bazel از درایورهای حالت کاربر و حالت هسته از پیش نصب شده روی سیستم استفاده می کنند.
هنگامی که حالت سازگاری فوروارد CUDA فعال است، اهداف Bazel از درایور حالت کاربر از توزیع مجدد درایور CUDA که در حافظه پنهان Bazel و درایور حالت هسته از پیش نصب شده روی سیستم دانلود شده است، استفاده خواهند کرد. این امکان فعال کردن ویژگی های جدید CUDA Toolkit را در حین استفاده از درایور حالت هسته قدیمی تر فراهم می کند.
حالت سازگاری فوروارد باید فقط زمانی اعمال شود که مناسب باشد - برای جزئیات به مستندات NVIDIA مراجعه کنید.
نسخه هرمتیک CUDA/CUDNN را ارتقا دهید
با دیکشنری های به روز شده
CUDA_REDIST_JSON_DICT
،CUDA_REDIST_JSON_DICT
در 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
در third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl بهروزرسانی کنید.در صورت نیاز،
PTX_VERSION_DICT
در third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl بهروزرسانی کنید.برای هر پروژه Google ML یک درخواست کشش جداگانه با
HERMETIC_CUDA_VERSION
وHERMETIC_CUDNN_VERSION
به روز شده در فایل.bazelrc
. ایجاد کنید.اجرای کار پیشفرض PR آزمایشهای بازل را راهاندازی میکند و توزیعهای هرمتیک 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 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
این گزینه اجازه می دهد تا از توزیع های سفارشی برای همه وابستگی های CUDA/CUDNN در پروژه های Google ML استفاده کنید.
فایلهای
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", } } } }
فیلد
relative_path
را می توان باfull_path
برای URL های کامل و مسیرهای محلی مطلق که باfile:///
شروع می شوند جایگزین کرد.در پروژه پایین دستی وابسته به 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 در پروژه های Google ML می دهد.
در پروژه پایین دستی وابسته به 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", )
در همان فایل
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", } } } }
فیلد
relative_path
را می توان باfull_path
برای URL های کامل و مسیرهای محلی مطلق که باfile:///
شروع می شوند جایگزین کرد.در همان فایل
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) استفاده شود.
در اینجا مراحل استفاده از CUDA غیر هرمتیک نصب شده به صورت محلی در پروژه های Google ML آمده است:
تماسهای قوانین مخزن هرمتیک CUDA را از فایل
WORKSPACE
پروژه وابسته به XLA حذف کنید.تماسها را به قوانین مخزن CUDA غیرهرمتیک در پایین فایل
WORKSPACE
اضافه کنید.برای XLA و JAX:
load("@xla//third_party/gpus:cuda_configure.bzl", "cuda_configure") cuda_configure(name = "local_config_cuda") load("@xla//third_party/nccl:nccl_configure.bzl", "nccl_configure") nccl_configure(name = "local_config_nccl")
برای تنسورفلو:
load("@local_xla//third_party/gpus:cuda_configure.bzl", "cuda_configure") cuda_configure(name = "local_config_cuda") load("@local_xla//third_party/nccl:nccl_configure.bzl", "nccl_configure") nccl_configure(name = "local_config_nccl")
متغیرهای محیطی زیر را مستقیماً در پوسته خود یا در فایل
.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_VERSION
وTF_CUDNN_VERSION
باید فقط از نسخه های اصلی و فرعی تشکیل شوند (مثلاً12.3
برای CUDA و9.1
برای CUDNN).اکنون می توانید دستور
bazel
را برای استفاده از CUDA و CUDNN نصب شده محلی اجرا کنید.برای XLA، هیچ تغییری در گزینه های فرمان لازم نیست.
برای JAX، از پرچم
--override_repository=tsl=<tsl_path>
در گزینه های فرمان Bazel استفاده کنید.برای Tensorflow، از پرچم
--override_repository=local_tsl=<tsl_path>
در گزینه های فرمان Bazel استفاده کنید.