يستخدم تطبيق 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( "@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 بشكل صحيح لاختبار الملفات التنفيذية. يكون الإعداد التلقائي للعلامة خطأ لتجنُّب الربط غير المرغوب فيه لحِزم 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 إذا لزم الأمر.لكل مشروع من مشاريع "الذكاء الاصطناعي من Google"، أنشئ طلب سحب منفصلاً يتضمّن ملف
.bazelrc
الذي تم تعديلهHERMETIC_CUDA_VERSION
وHERMETIC_CUDNN_VERSION
.ستؤدي عمليات تنفيذ مهام التقديم المُسبَق لطلب المراجعة إلى تشغيل اختبارات bazel وتنزيل توزيعات hermetic 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.