يستخدم 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 غير المُحكم.
third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl: يتضمّن هذا الملفّ عملية الربط بين إصدار CUDA وإصدار التوزيع NCCL الذي سيتم تنزيله.
ضبط 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 بشكل صحيح لاختبار الملفات التنفيذية. يكون الإعداد التلقائي للعلامة خطأ لتجنُّب الربط غير المرغوب فيه لحِزم Python التي تنشرها Google ببرامج CUDA الثنائية.
لفرض وضع التوافق المستقبلي مع CUDA، أضِف العلامة
--@cuda_driver//:enable_forward_compatibility=true
إلى الأمر bazel. يمكنك تقديمها مباشرةً في بيئة سطر الأوامر أو في.bazelrc
:test:cuda --@cuda_driver//:enable_forward_compatibility=true
القيمة التلقائية للعلامة هي
false
.عند إيقاف وضع التوافق المستقبلي لـ CUDA، ستستخدم أهداف Bazel برامج تشغيل "وضع المستخدم" و"وضع النواة" المثبَّتة مسبقًا على النظام.
عند تفعيل وضع التوافق المستقبلي مع CUDA، ستستخدم أهداف Bazel "برنامج تشغيل وضع المستخدم" من إعادة توزيع برنامج تشغيل CUDA الذي تم تنزيله في ذاكرة التخزين المؤقت في Bazel و"برنامج تشغيل وضع النواة" المثبَّت مسبقًا على النظام. يسمح هذا الخيار بتفعيل ميزات CUDA Toolkit الجديدة أثناء استخدام برنامج تشغيل Kernel Mode Driver الأقدم.
يجب فرض وضع التوافق مع الإصدارات المستقبلية فقط عندما يكون ذلك مناسبًا. يمكنك الاطّلاع على مستندات 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"، أنشئ طلب سحب منفصلاً يتضمّن ملف
.bazelrc
الذي تم تعديلهHERMETIC_CUDA_VERSION
وHERMETIC_CUDNN_VERSION
.ستؤدي عمليات تنفيذ مهام التقديم المُسبَق لطلب المراجعة إلى تشغيل اختبارات bazel وتنزيل موزّعات 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
نفسه، نقْل القواميس التي تم إنشاؤها إلى قاعدة بيانات المحتوى rule. إذا كانت القواميس تحتوي على مسارات نسبية إلى التوزيعات، يجب تعديل البادئة المسار في طلبات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
محتوى
ملف JSON الناتج عن CUDA، وتلغي بيانات التوزيعات في _CUDNN_DIST_DICT
محتوى
ملف JSON الناتج عن CUDNN. يتم دمج بيانات عجلات 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("@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")
بالنسبة إلى Tensorflow:
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")
اضبط متغيّرات البيئة التالية مباشرةً في بيئة Shell أو فيملف
.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>
في optionscommand Bazel.