نظرة عامة على CUDA المُحكم

يستخدم تطبيق 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 المُحكم

  1. في مشروع ما بعد الإنتاج الذي يعتمد على 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")
    
  2. لاختيار إصدارات معيّنة من قيم 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"
    
  3. لتفعيل 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 الثنائية.

  4. لفرض وضع التوافق المستقبلي مع 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 المُحَث

  1. أنشئ طلبًا لإضافة الإصدارات المعدَّلة من قواميس 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 إذا لزم الأمر.

  2. لكل مشروع من مشاريع "الذكاء الاصطناعي من 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.

  1. أنشئ ملفات 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:///.

  2. في المشروع التالي الذي يعتمد على 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.

  1. في المشروع التابع الذي يعتمد على 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",
    )
    
  2. في ملف 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:///.

  3. في ملف 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:

  1. احذف طلبات الوصول إلى قواعد مستودع CUDA المُحكم من WORKSPACEملف المشروع الذي يعتمد على XLA.

  2. أضِف طلبات الوصول إلى قواعد مستودع 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")
    
  3. اضبط متغيّرات البيئة التالية مباشرةً في واجهة الأوامر أو في ملف .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).

  4. يمكنك الآن تنفيذ الأمر bazel لاستخدام CUDA وCUDNN المثبَّتَين على الجهاز.

    أما بالنسبة إلى ملف XLA، فلا حاجة إلى إجراء أي تغييرات في خيارات الأوامر.

    بالنسبة إلى JAX، استخدِم العلامة --override_repository=tsl=<tsl_path> في خيارات أمر Bazel .

    بالنسبة إلى Tensorflow، استخدِم العلامة --override_repository=local_tsl=<tsl_path> في خيارات أمر Bazel.