نظرة عامة على 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 غير المحكم.

يمكن تحديد التعيين بين إصدار CUDA وإصدار توزيع NCCL المطلوب تنزيله في third_party/gpus/cuda/hermetic/cuda_redist_versions.bzl.

ضبط معرّف 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 بشكل صحيح لاختبار الملفات التنفيذية. يكون الإعداد التلقائي للعلامة هو false لتجنُّب الربط غير المرغوب فيه لحِزم Python التي تنشرها Google ببرامج CUDA الثنائية.

  4. لفرض وضع التوافق المستقبلي مع CUDA، أضِف العلامة --@cuda_driver//:enable_forward_compatibility=true إلى الأمر bazel . يمكنك تقديمها مباشرةً في ملف شل أو في .bazelrc:

    test:cuda --@cuda_driver//:enable_forward_compatibility=true
    

    يجب فرض وضع التوافق مع الإصدارات المستقبلية فقط عندما يكون ذلك مناسبًا. يمكنك الاطّلاع على مستندات 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، أنشئ طلب سحب منفصلاً يتضمّن تحديثات 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.

  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.