يستخدم تطبيق Hermetic CUDA نسخةً محددة قابلة للتنزيل من CUDA بدلاً من إصدار المستخدم CUDA المثبَّتة محليًا. ستقوم Bazel بتنزيل توزيعات CUDA وCUDNN وNCCL ثم نستخدم مكتبات وأدوات CUDA باعتبارها تبعيات في أهداف Bazel المختلفة. يتيح ذلك إنشاء المزيد من النُسخ القابلة للتكرار لمشاريع تعلُّم الآلة من Google وإصدارات 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( "@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")
لتحديد إصدارات معينة من 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 بشكل صحيح لاختبار الملفات التنفيذية. يكون الإعداد التلقائي للعلامة هو false لتجنُّب الربط غير المرغوب فيه لحِزم Python التي تنشرها Google ببرامج CUDA الثنائية.
لفرض وضع التوافق المستقبلي مع CUDA، أضِف العلامة
--@cuda_driver//:enable_forward_compatibility=true
إلى الأمر bazel . يمكنك تقديمها مباشرةً في ملف شل أو في.bazelrc
:test:cuda --@cuda_driver//:enable_forward_compatibility=true
يجب فرض وضع التوافق مع الإصدارات المستقبلية فقط عندما يكون ذلك مناسبًا. يمكنك الاطّلاع على مستندات 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 إذا لزم الأمر.لكل مشروع من مشاريع تعلُّم الآلة في Google، أنشئ طلب سحب منفصلاً يتضمّن تحديثات
HERMETIC_CUDA_VERSION
وHERMETIC_CUDNN_VERSION
في ملف.bazelrc
ستطلق عمليات تنفيذ المهام في PR قبل التقديم اختبارات بازل وتنزيل البيانات توزيعات CUDA/CUDNN تأكَّد من اجتياز مهام الفحص قبل الإرسال قبل إرسال طلب إعادة النظر.
الإشارة إلى عمليات إعادة توزيع 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 على النحو التالي:
<LOCAL_NCCL_PATH>
include/
lib/
أرشيفات CUDA/CUDNN المخصّصة وحلقات NCCL
هناك ثلاثة خيارات تتيح استخدام توزيعات CUDA/CUDNN المخصّصة.
ملفات JSON المخصّصة لإعادة توزيع CUDA/CUDNN
يتيح هذا الخيار استخدام توزيعات مخصّصة لجميع تبعيات CUDA/CUDNN في مشاريع الذكاء الاصطناعي من Google.
أنشئ ملفات
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، عدِّل طلب مستودع JSON cuda hermetic في ملف
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.
في المشروع التابع الذي يعتمد على 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، قد يتم استخدامه بعض التجارب غير المعتمدة رسميًا حاليًا (على سبيل المثال، عجلات البناء) على Windows باستخدام CUDA).
في ما يلي خطوات استخدام حزمة CUDA غير المُحكمَة المثبَّتة محليًا في مشاريع الذكاء الاصطناعي من Google:
حذف الطلبات الموجَّهة إلى القواعد المشروطة لمستودع CUDA من "
WORKSPACE
" للمشروع يعتمد على XLA.أضف عمليات الاستدعاء إلى قواعد مستودع CUDA غير المتناسقة في الجزء السفلي من ملف
WORKSPACE
.بالنسبة إلى 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")
اضبط متغيرات البيئة التالية مباشرةً في واجهة الأوامر أو في ملف
.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.