نمای کلی هرمتیک CUDA

هرمتیک CUDA از یک نسخه قابل دانلود خاص CUDA به جای CUDA نصب شده محلی کاربر استفاده می کند. Bazel توزیع های CUDA، CUDNN و NCCL را دانلود می کند و سپس از کتابخانه ها و ابزارهای CUDA به عنوان وابستگی در اهداف مختلف Bazel استفاده می کند. این کار ساخت‌های قابل تکرار بیشتری را برای پروژه‌های Google ML و نسخه‌های پشتیبانی‌شده 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/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 ML یک درخواست کشش جداگانه با HERMETIC_CUDA_VERSION و HERMETIC_CUDNN_VERSION به روز شده در فایل .bazelrc . ایجاد کنید.

    اجرای کار پیش‌فرض PR آزمایش‌های بازل را راه‌اندازی می‌کند و توزیع‌های هرمتیک CUDA/CUDNN را دانلود می‌کند. بررسی کنید که پیش از ارسال مشاغل قبل از ارسال PR تأیید شده است.

اشاره به توزیع مجدد 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 dir باید به شکل زیر باشد (انگار توزیع‌های بایگانی‌شده در یک مکان باز شده است):

<LOCAL_CUDA_PATH>/
    include/
    bin/
    lib/
    nvvm/

ساختار پوشه های داخل CUDNN dir باید به صورت زیر باشد:

<LOCAL_CUDNN_PATH>
    include/
    lib/

ساختار پوشه های داخل NCCL dir باید به صورت زیر باشد:

<LOCAL_NCCL_PATH>
    include/
    lib/

آرشیوهای سفارشی CUDA/CUDNN و چرخ های NCCL

سه گزینه وجود دارد که امکان استفاده از توزیع های سفارشی CUDA/CUDNN را فراهم می کند.

سفارشی CUDA/CUDNN توزیع مجدد فایل های JSON

این گزینه اجازه می دهد تا از توزیع های سفارشی برای همه وابستگی های CUDA/CUDNN در پروژه های Google ML استفاده کنید.

  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، فراخوانی مخزن هرمتیک cuda JSON را در فایل 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 ML می دهد.

  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 منسوخ شده است، ممکن است برای برخی آزمایش‌ها که در حال حاضر به طور رسمی پشتیبانی نمی‌شوند (به عنوان مثال، ساختن چرخ‌ها در ویندوز با CUDA) استفاده شود.

در اینجا مراحل استفاده از CUDA غیر هرمتیک نصب شده به صورت محلی در پروژه های Google ML آمده است:

  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")
    

    برای تنسورفلو:

    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 استفاده کنید.

هرمتیک 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 به درستی برای آزمایش‌های اجرایی ارائه شده است مورد نیاز است. این پرچم به طور پیش‌فرض نادرست است تا از جفت شدن ناخواسته چرخ‌های پایتون منتشر شده توسط Google با باینری‌های CUDA جلوگیری شود.