এই ডকুমেন্টটিতে AMD ROCm কন্টিনিউয়াস ইন্টিগ্রেশন (CI) ইমপ্লিমেন্টেশন বর্ণনা করা হয়েছে। এতে GitHub Actions ওয়ার্কফ্লো, রানার পুল, ডকার কন্টেইনার, বেজেল কনফিগারেশন, ট্যাগ ফিল্টার, জিপিইউ লকিং এবং ROCm/xla এর সাথে আপস্ট্রিম-ফর্ক সম্পর্ক অন্তর্ভুক্ত রয়েছে।
সেটআপটিতে দুটি স্বতন্ত্র পথ রয়েছে:
- ROCm CI ওয়ার্কফ্লো (
.github/workflows/rocm_ci.yml): একটি সেলফ-হোস্টেড AMD Instinct GPU রানারে ফিজিক্যাল XLA এবং JAX টেস্ট চালায়। - শুধুমাত্র কম্পাইলযোগ্য ROCm CI (
.github/workflows/ci.yml): এটি GPU ছাড়া একটি জেনেরিক লিনাক্স x86 রানারে একটি হারমেটিক ROCm টুলচেইনের বিপরীতে XLA বিল্ড করে।
এই পথগুলো হার্ডওয়্যারে রানটাইম যাচাইকরণ এবং প্রতিটি কমিটে কম্পাইলেশনের নির্ভরযোগ্যতা উভয়ই নিশ্চিত করে।
ট্রিগার এবং সমকালীনতা
rocm_ci.yml চলে:
-
mainবিপরীতেpull_request(jaxজবটি অতিরিক্তভাবেgithub.base_ref == 'main'শর্তের উপর নির্ভরশীল)। -
workflow_dispatch(ম্যানুয়াল)।
ci.yml ভিতরে থাকা শুধুমাত্র-কম্পাইলযোগ্য ROCm পাথটি CI ম্যাট্রিক্সের বাকি অংশগুলোর মতোই একই pull_request ইভেন্টগুলোতে এবং পোস্ট-সাবমিট পর্যায়ে চলে।
উভয় ওয়ার্কফ্লোই ওয়ার্কফ্লো + হেড রেফ দ্বারা কী করা একটি কনকারেন্সি গ্রুপ শেয়ার করে, তাই একটি পিআর-এ নতুন পুশ করলে সেই পিআর-এর চলমান যেকোনো রান বাতিল হয়ে যায়, কিন্তু main -এর রান বাতিল হয় না।
concurrency:
group: ${ { github.workflow } }-${ { github.head_ref || github.ref } }
cancel-in-progress: ${ { github.ref != 'main' } }
অনুমতি শুধুমাত্র contents: read মধ্যে সীমাবদ্ধ। লেখার সুযোগ বা আর্টিফ্যাক্ট আপলোড সক্রিয় নেই।
রানার এবং কন্টেইনার কনফিগারেশন
রানার পুল
ROCm জবগুলো linux-x86-64-1gpu-amd লেবেলযুক্ত একটি সেলফ-হোস্টেড GitHub Actions রানার ব্যবহার করে। এটি একটি Linux x86_64 হোস্ট, যার সাথে একটিমাত্র AMD Instinct GPU সংযুক্ত আছে এবং যা বর্তমানে gfx950 টার্গেট করছে। এই লেবেলটি AMD-এর মালিকানাধীন RBE রানার ফ্লিটের সাথে লিঙ্ক করা, যেখানে বিল্ড এবং টেস্টগুলো চলে। এই ড্যাশবোর্ডে এই ক্লাস্টারের অবস্থা পর্যবেক্ষণ করা যেতে পারে।
ডকার ইমেজ
জবগুলো একটি ডকার কন্টেইনারে চলে। ডকার ইমেজটি এএমডি (AMD) সরবরাহ করে এবং এটি টেনসরফ্লো-এর অফিশিয়াল বিল্ড ইমেজ থেকে উদ্ভূত।
মূল বিষয়গুলো:
-
--device=/dev/kfdএবং--device=/dev/driবিকল্পগুলো কন্টেইনারের কাছে AMD GPU কার্নেল ফিউশন ড্রাইভার এবং DRI রেন্ডার নোডগুলোকে উন্মুক্ত করে। এগুলো ছাড়া কন্টেইনারটি GPU-কে দেখতে পায় না। -
--group-add videoকমান্ডটি কন্টেইনারের ব্যবহারকারীকেvideoগ্রুপে যুক্ত করে, যা উবুন্টুতে GPU ডিভাইস নোড অ্যাক্সেস করতে পারে এমন ব্যবহারকারীদের জন্য একটি প্রচলিত নিয়ম। -
--ipc=hostএবং--shm-size=64Gপ্রয়োজন, কারণ HIP/ROCm কালেক্টিভ (RCCL) এবং বেশ কিছু স্ট্রিম-এক্সিকিউটর পাথওয়ে একটিমাত্র নোডে আন্তঃপ্রক্রিয়া যোগাযোগের জন্য শেয়ার্ড মেমরি ব্যবহার করে। -
--cap-add=SYS_PTRACEএবং--security-opt=seccomp=unconfinedস্যানিটাইজার-ইনস্ট্রুমেন্টেড টেস্ট বাইনারিগুলোকে ডিবাগার সংযুক্ত করতে এবং সেকম্প ফিল্টার বাইপাস করতে সক্ষম করে, যা স্যানিটাইজার রানটাইম কলগুলোকে ব্লক করে। -
--tmpfs /root/.cache/bazel:rw,exec,size=80gকমান্ডটি Bazel ডিস্ক ক্যাশকে RAM-এ রাখে।execঅপশনটি বাধ্যতামূলক, কারণ Bazel সরাসরি ক্যাশ থেকেbazel-outবাইনারিগুলো রান করে। - হোস্টের
/dataথেকে মাউন্ট করা দুটিci-cert.*ফাইল হলো ক্লায়েন্ট TLS সার্টিফিকেট এবং প্রাইভেট কী, যা EngFlow রিমোট বিল্ড ক্লাস্টারে প্রমাণীকরণের জন্য ব্যবহৃত হয়।
কাজের টপোলজি
rocm_ci.yml তিনটি জব সংজ্ঞায়িত করে:
| চাকরি | উদ্দেশ্য | নির্ভর করে |
|---|---|---|
rocm-config | পিন করা ডকার ইমেজ ডাইজেস্টটি প্রকাশ করুন। | — |
jax | একটিমাত্র এএমডি জিপিইউ-তে, এক্সএলএ (XLA)-এর পরিবর্তনগুলোর সাথে মিলিয়ে জেএএক্স (JAX) বিল্ড ও টেস্ট করুন। | rocm-config |
xla | একটিমাত্র এএমডি জিপিইউ-তে সরাসরি এক্সএলএ তৈরি ও পরীক্ষা করুন, সেইসাথে শুধুমাত্র সিপিইউ-ভিত্তিক এক্সএলএ স্যুটটিও পরীক্ষা করুন। | rocm-config |
rocm-config শেষ হয়ে গেলে jax এবং xla সমান্তরালভাবে চলতে শুরু করে।
xla জবটি github.base_ref == 'main' এর উপর নির্ভরশীল নয় ; কিন্তু jax জবটি নির্ভরশীল। এর মানে হলো, JAX স্যুটটি শুধুমাত্র main টার্গেট করা PR-গুলোর জন্য চলে, অপরদিকে XLA স্যুটটি যেকোনো PR এবং workflow_dispatch জন্য চলে।
timeout-minutes জব লেভেলে সেট করা হয়, এবং প্রতিটি টেস্ট স্টেপে আরও কঠোর timeout-minutes: 60 (XLA সিঙ্গেল-GPU, JAX) অথবা ৮০ (XLA CPU স্যুট)।
XLA CI চাকরি
ধাপের ক্রম
- PR হেডে
openxla/xlaদেখে নিন। -
ROCm/xlaফর্ক থেকে AMD দ্বারা পরিচালিত ড্রাইভার স্ক্রিপ্টটি (execute_ci_build_upstream.sh) ডাউনলোড করুন। - ডিবাগ করার সুবিধার জন্য সিপিইউ (
lscpu) এবং জিপিইউ (rocminfo) তথ্য প্রিন্ট করুন। - ডাউনলোড করা স্ক্রিপ্টটি ব্যবহার করে পরীক্ষার পর্যায়গুলো (সিঙ্গেল-জিপিইউ এবং সিপিইউ) চালান।
--config=ci_single_gpu এবং --config=ci_rocm_cpu অর্থ কী
এগুলো build_tools/rocm/rocm_xla.bazelrc এ সংজ্ঞায়িত করা আছে। সিঙ্গেল-জিপিইউ স্যুটটি প্যারালাল জিপিইউ হেল্পার ব্যবহার করে, ফ্লেকস তিনবার রিট্রাই করে এবং প্রসেস-আইসোলেটেড পদ্ধতিতে টেস্টগুলো চালায়। সিপিইউ স্যুটটি ২০০-ওয়াইড লোকাল প্যারালালিজম এবং স্যানিটাইজার র্যাপার ব্যবহার করে:
build:ci_single_gpu --run_under=//build_tools/rocm:parallel_gpu_execute
build:ci_single_gpu --flaky_test_attempts=3
build:ci_rocm_cpu --run_under=//build_tools/rocm:sanitizer_wrapper
build:ci_rocm_cpu --local_test_jobs=200
build:ci_rocm_cpu --strategy=TestRunner=local
bazelrc-তে ci_multi_gpu নামে একটি তৃতীয় কনফিগ রয়েছে, কিন্তু এটি বর্তমানে rocm_ci.yml থেকে ট্রিগার করা হয় না — এটি ≥৪টি GPU যুক্ত হোস্টগুলিতে run_xla_multi_gpu.sh নামক স্বতন্ত্র হেল্পার দ্বারা ব্যবহৃত হয়।
ট্যাগ ফিল্টারিং
execute_ci_build_upstream.sh ( ROCm/xla ফর্কে) build_tools/rocm/rocm_tag_filters.sh এ থাকা হেল্পারটি ব্যবহার করে একটি ট্যাগ ফিল্টার তালিকা তৈরি করে। লিগ্যাসি ইন-ট্রি র্যাপার build_tools/rocm/run_xla_ci_build.sh একই প্যাটার্ন দেখায়:
TAG_FILTERS=$($SCRIPT_DIR/rocm_tag_filters.sh)
for arg in "$@"; do
if [[ "$arg" == "--config=ci_multi_gpu" ]]; then
TAG_FILTERS="${TAG_FILTERS},requires-gpu-rocm,requires-gpu-amd,multi_gpu"
fi
if [[ "$arg" == "--config=ci_single_gpu" ]]; then
TAG_FILTERS="${TAG_FILTERS},requires-gpu-rocm,requires-gpu-amd,-multi_gpu"
fi
if [[ "$arg" == "--config=ci_rocm_cpu" ]]; then
TAG_FILTERS="${TAG_FILTERS},gpu,-requires-gpu-rocm,-requires-gpu-amd"
fi
done
rocm_tag_filters.sh থেকে প্রাপ্ত মূল তালিকাটি হলো "যে কাজগুলো ROCm CI-এর কখনোই করা উচিত নয়":
-no_gpu
-requires-gpu-intel
-requires-gpu-nvidia
-requires-gpu-cuda
-cuda-only
-oneapi-only
-requires-gpu-sm60
-requires-gpu-sm60-only
-requires-gpu-sm70
-requires-gpu-sm70-only
-requires-gpu-sm80
-requires-gpu-sm80-only
-requires-gpu-sm86
-requires-gpu-sm86-only
-requires-gpu-sm89
-requires-gpu-sm89-only
-requires-gpu-sm90
-requires-gpu-sm90-only
-skip_rocprofiler_sdk
-no_oss
-oss_excluded
-oss_serial
এরপর কনফিগারেশন-ভিত্তিক সংযোজনগুলো সেটটিকে সংকুচিত করে:
| কনফিগারেশন | যোগ করে |
|---|---|
ci_single_gpu | requires-gpu-rocm , requires-gpu-amd , -multi_gpu |
ci_multi_gpu | requires-gpu-rocm , requires-gpu-amd , multi_gpu |
ci_rocm_cpu | gpu , -requires-gpu-rocm , -requires-gpu-amd |
নাম অনুসারে বাদ দেওয়া পরীক্ষাগুলি
কালেক্টিভ, শার্ডিং প্রোপাগেশন এবং ডিস্ট্রিবিউটেড পিজেআরটি-র জন্য একাধিক এএমডি জিপিইউ প্রয়োজন হয় এবং এগুলো সিঙ্গেল-জিপিইউ রান থেকে ফিল্টার করা থাকে। এগুলো অবশ্যই একটি ডেডিকেটেড মাল্টি-জিপিইউ হোস্টে এক্সিকিউট করতে হবে।
JAX CI জব
JAX জবটি একই কন্টেইনারে চলে, কিন্তু JAX নিজেই সরবরাহ করা একটি ভিন্ন ড্রাইভার স্ক্রিপ্ট ব্যবহার করে:
./ci/run_bazel_test_rocm_rbe.sh \
--override_repository=xla="${GITHUB_WORKSPACE}" \
--override_module=xla="${GITHUB_WORKSPACE}" \
--config=single_gpu \
--//jax:build_jaxlib=wheel \
--//jax:build_jax=true \
--local_test_jobs=1 \
--action_env=JAX_ENABLE_X64=0 \
--repo_env=HERMETIC_PYTHON_VERSION=3.14 \
--repo_env=TF_ROCM_RBE_DOCKER_IMAGE="${DOCKER_IMAGE}"
পতাকার বিবরণ:
-
--override_repository=xla=...এবং--override_module=xla=...পুল রিকোয়েস্টের (PR) ইন-ট্রি চেকআউটের সময় JAX-এরxlaডিপেন্ডেন্সিকে রিডাইরেক্ট করে। এগুলো ছাড়া JAX জবটি JAX-এর WORKSPACE/MODULE.bazel-এ রেকর্ড করা পিন করা XLA কমিটের বিপরীতে কম্পাইল হবে, যা একটি XLA PR থেকে JAX চালানোর উদ্দেশ্যকেই ব্যর্থ করে দেবে। -
--//jax:build_jaxlib=wheelএবং--//jax:build_jax=truejaxlib-কে একটি হুইল আর্টিফ্যাক্ট হিসেবে বিল্ড করে এবং jax-কে সোর্স থেকে রি-বিল্ড করে — JAX বর্তমানে টেস্টের জন্য এভাবেই C++ এক্সটেনশনটি বুটস্ট্র্যাপ করে। -
HERMETIC_PYTHON_VERSION=3.14পাইথন টুলচেইনকে নিশ্ছিদ্রভাবে নির্বাচন করে (হোস্ট পাইথন নির্বিশেষে বিল্ডটি পুনরুৎপাদনযোগ্য)। -
--local_test_jobs=1জিপিইউ-এর উপর চাপ কম রাখে; রানারে কেবল একটি এএমডি জিপিইউ থাকলে, জেএএক্স টেস্টগুলো সমান্তরালভাবে চালানোর কোনো সুবিধা নেই। -
JAX_ENABLE_X64=0দ্রুত CI-এর জন্য JAX টিমের ডিফল্ট টেস্ট পদ্ধতির সাথে সামঞ্জস্যপূর্ণ। - একই
TF_ROCM_RBE_DOCKER_IMAGEপ্রেরণ করা হয়, যাতে বিল্ডটি EngFlow থেকে যে কোনো রিমোট ওয়ার্কার লিজ নেয়, সেটি একই ROCm ইমেজ চালায়।
রিমোট বিল্ড এক্সিকিউশন (EngFlow)
ROCm CI রিমোট ক্যাশিং এবং রিমোট এক্সিকিউশন উভয়ের জন্য একটি EngFlow রিমোট বিল্ড ক্লাস্টার ( grpcs://wardite.cluster.engflow.com ) ব্যবহার করে। এর কনফিগারেশন build_tools/rocm/rocm_xla.bazelrc ফাইলে থাকে।
এই ক্লাস্টারে প্রমাণীকরণ মাউন্টেড সার্টিফিকেটের ( /data/ci-cert.crt , /data/ci-cert.key ) মাধ্যমে সম্পন্ন করা হয়।
মূল কনফিগারেশন:
-
REMOTE_GPU_TESTING=1: রিমোট-এক্সিকিউশন অপ্টিমাইজেশন সক্ষম করে (যেমন, ফাইলসিস্টেম অ্যাক্সেস সীমাবদ্ধ করা)। -
@local_config_rocm//rocm:linux_x64: প্ল্যাটফর্ম নির্দিষ্ট করে, যা@local_config_rocmরিপোজিটরি সমাধান করার জন্য ওয়ার্কারদের উপর সিস্টেম-স্তরের ROCm ইনস্টলেশন ধরে নেয়।
এছাড়াও একটি rocm_rbe_dynamic কনফিগারেশন রয়েছে যা স্থানীয়ভাবে বিল্ড করে কিন্তু বেজেলের ডায়নামিক শিডিউলারের অধীনে পরীক্ষা করে (প্রতিটি পরীক্ষার অ্যাকশন একই সাথে স্থানীয়ভাবে এবং দূরবর্তীভাবে চালায়, যেটি আগে শেষ হয় সেটি গ্রহণ করে):
build:rocm_rbe_dynamic --config=rocm_rbe
build:rocm_rbe_dynamic --spawn_strategy=local
test:rocm_rbe_dynamic --experimental_spawn_scheduler
test:rocm_rbe_dynamic --strategy=TestRunner=dynamic
test:rocm_rbe_dynamic --dynamic_mode=default
test:rocm_rbe_dynamic --dynamic_local_strategy=worker,standalone,local
test:rocm_rbe_dynamic --dynamic_remote_strategy=remote
test:rocm_rbe_dynamic --experimental_local_execution_delay=1000
test:rocm_rbe_dynamic --local_resources=cpu=HOST_CPUS*0.5
rocm_ci.yml এর XLA সিঙ্গেল-GPU স্টেপটি মূলত এই পদ্ধতিটিই ব্যবহার করে, যেখানে --config=rocm_rbe এর উপরে সরাসরি কমান্ড লাইনে --internal_spawn_scheduler --strategy=TestRunner=dynamic পাস করা হয়।
তৃতীয় "আম্ব্রেলা" কনফিগ, rocm_ci , নিম্নলিখিত উপায়ে লোড করা হয়:
# rocm_xla_ci.bazelrc
try-import /usertools/rocm.bazelrc
try-import %workspace%/build_tools/rocm/rocm_xla.bazelrc
/usertools/rocm.bazelrc AMD দ্বারা নির্মিত ডকার ইমেজের সাথে সরবরাহ করা হয় (এটি হোস্টের ROCm ইনস্টল পাথগুলোকে এনকোড করে); এর উপরে ইন-ট্রি bazelrc লেয়ার হিসেবে থাকে। সুতরাং, --config=rocm_ci অর্থ হলো "ইমেজ-এর ভেতরের ROCm টুলচেইন এবং ইন-ট্রি XLA কনফিগারেশন উভয়ই ব্যবহার করা"।
জিপিইউ লকিং
যখন AMD হোস্টে একটি GPU টেস্ট চালানো হয়, তখন Bazel এটিকে --run_under=//build_tools/rocm:parallel_gpu_execute এর মাধ্যমে চালু করে। স্ক্রিপ্টটি ( build_tools/rocm/parallel_gpu_execute.sh ) তিনটি কাজ করে:
rocminfoকল করে এবংName: *gfx*লাইনগুলো গণনা করে রানারটির আসলে কয়টি GPU আছে তা বের করুন।ROCMINFO=$(find -L "${TEST_SRCDIR:-.}" -name "rocminfo" -path "*/bin/rocminfo" | head -n 1) TF_GPU_COUNT=$($ROCMINFO | grep "Name: *gfx*" | wc -l)build_tools/rocm/BUILDফাইলে Bazel টার্গেটেরdata = ["//tensorflow/third_party/rocm/google:rocminfo"]এর মাধ্যমেrocminfoঅ্যাকশনের রানফাইলগুলোতে অন্তর্ভুক্ত করা হয়, ফলে এটি রিমোট-এক্সিকিউশন স্যান্ডবক্সের ভেতরে শনাক্তযোগ্য থাকে।যদি
TF_GPU_COUNT == 0(যেমন RBE ডিফল্ট পুলে, যেখানে কোনো GPU নেই), তাহলে স্ক্রিপ্টটি কেবলexec "$@"— টেস্টটি তখনও চলে, কিন্তু কোনো প্রতি-GPU আইসোলেশন ছাড়াই। যে টেস্টগুলোর জন্য সত্যিই একটি GPU প্রয়োজন, সেগুলো নিজে থেকেই ফেইল করবে বলে আশা করা হয়; এই ব্রাঞ্চটি তৈরি করা হয়েছে যাতে GPU-ট্যাগযুক্ত টেস্টগুলো, যেগুলো আসলে CPU-তে চলতে পারে , সেগুলোও সস্তা ওয়ার্কার মেশিনে এক্সিকিউট হয়।অন্যথায়, প্রতিটি
(gpu, slot_within_gpu)জোড়ার জন্য একটি করেflock-ভিত্তিক স্লট অধিগ্রহণ করুন, এবং পরীক্ষার সময়কালের জন্যCUDA_VISIBLE_DEVICESওHIP_VISIBLE_DEVICESসেই GPU ইনডেক্সে এক্সপোর্ট করুন:for j in `seq 0 $((TF_TESTS_PER_GPU-1))`; do for i in `seq 0 $((TF_GPU_COUNT-1))`; do exec {lock_fd}>/var/lock/gpulock${i}_${j} || exit 1 if flock -n "$lock_fd"; then ( export CUDA_VISIBLE_DEVICES=$i export HIP_VISIBLE_DEVICES=$i "$TEST_BINARY" "$@" ) … fi done done
মেমরি ওভারসাবস্ক্রাইব করার আগে প্রতিযোগিতা কমানোর জন্য জিপিইউ জুড়ে স্লটগুলি ক্রমানুসারে পূরণ করা হয় (যেমন, প্রথমে সমস্ত জিপিইউ-তে স্লট ০, তারপর স্লট ১)।
build_tools/ci/parallel_gpu_execute.sh এ এর একটি প্রায়-অভিন্ন অনুলিপিও রয়েছে, যেটি হলো CUDA-ভিত্তিক সংস্করণ এবং NVIDIA জবগুলো দ্বারা ব্যবহৃত হয়। এদের মধ্যে প্রধান পার্থক্য হলো, ROCm সংস্করণটি রানটাইমে rocminfo যাচাই করে, যেখানে CUDA সংস্করণটি ডিফল্টভাবে TF_GPU_COUNT=4 বিশ্বাস করে।
//build_tools/rocm:sanitizer_wrapper নামে একটি দ্বিতীয় হেল্পার ci_rocm_cpu এবং ci_multi_gpu দ্বারা ব্যবহৃত হয়। এটি একটি ক্ষুদ্র জেনারেটেড শেল স্ক্রিপ্ট ( echo '#!/bin/bash' > $@; echo 'exec "$$@"' >> $@ ) যার একমাত্র কাজ হলো স্যানিটাইজার ইগনোর লিস্টগুলোকে রানফাইল হিসেবে ঘোষণা করা, যাতে সেই ইগনোর লিস্টগুলোতে কোনো পরিবর্তন হলে প্রভাবিত টেস্ট অ্যাকশনগুলো পুনরায় রান করতে বাধ্য হয়।
স্বতন্ত্র সহায়ক
build_tools/rocm/ ফোল্ডারের তিনটি স্ক্রিপ্ট একটি স্থানীয় AMD মেশিনে ম্যানুয়ালি চালানোর জন্য ডিজাইন করা হয়েছে এবং এগুলো CI-এর মতোই একই নিয়মকানুন অনুসরণ করে:
-
run_xla.sh— একক-GPU XLA টেস্ট সুইপ। এটিrocm-smiএর মাধ্যমে GPU সংখ্যা শনাক্ত করে,N_TEST_JOBS = TF_GPU_COUNT * TF_TESTS_PER_GPUগণনা করে,TF_ROCM_AMDGPU_TARGETSসেট করার জন্যrocminfoথেকেgfx*ID সংগ্রহ করে, এবংbazel test --config=rocm_ci --config=xla_sgpu …কমান্ডটি চালু করে। এর ট্যাগ ফিল্টার রেসিপি CI-এর মতোই (যদিও বাস্তবায়নের বিবরণে সামান্য পার্থক্য রয়েছে)। এটি--run_under=//build_tools/ci:parallel_gpu_execute(CUDA-স্টাইলের র্যাপার) ব্যবহার করে। -
run_xla_multi_gpu.sh— একাধিক জিপিইউ-এর XLA টেস্ট সুইপ। এর জন্যTF_GPU_COUNT ≥ 4প্রয়োজন, অন্যথায় এটি নীরবে বন্ধ হয়ে যায়। এটি--config=xla_mgpuব্যবহার করে,NCCL_MAX_NCHANNELS=1সেট করে, এবং বিশেষভাবে উল্লেখ্য যে এটি--run_under=//build_tools/ci:parallel_gpu_executeপাস করে না — কারণ সম্মিলিত টেস্টগুলোর জন্য একই সাথে সমস্ত জিপিইউ দেখার প্রয়োজন হয়, তাই প্রতি-টেস্ট জিপিইউ পিনিং করলে সেগুলো ভেঙে যাবে। -
run_xla_ci_build.sh— এটি হলো CI এখনROCm/xlaথেকে যা কিছু সংগ্রহ করে, তার ইন-ট্রি লিগ্যাসি সংস্করণ।--config=…আর্গুমেন্টগুলো কীভাবে ট্যাগ ফিল্টারের সাথে যুক্ত হয়, তার ডকুমেন্টেশন হিসেবে এটি উপযোগী।
এএমডি ডেভেলপারদের স্থানীয়ভাবে সিআই আচরণ পুনরুৎপাদন করার জন্য এই তিনটি বিদ্যমান।
শুধুমাত্র কম্পাইলযোগ্য ROMm CI
জিপিইউ রানার থেকে স্বাধীনভাবে, .github/workflows/ci.yml একটি জেনেরিক লিনাক্স x86 রানারে একটি XLA Linux x86 GPU ROCm জব চালায়, যেখানে কোনো জিপিইউ বা ROCm সিস্টেম ইনস্টল করা থাকে না। এটি জিপিইউ রানারের প্রাপ্যতা নির্বিশেষে সমস্ত পিআর-এর কম্পাইলেশনের নির্ভরযোগ্যতা নিশ্চিত করে।
এই কাজের জন্য রানার পুল এবং কন্টেইনারগুলো হলো:
{
pool: "linux-x86-n2-16",
container: "us-docker.pkg.dev/ml-oss-artifacts-published/ml-public-container/ml-build:latest",
name: "XLA Linux x86 GPU ROCm",
repo: "openxla/xla",
}
একটিমাত্র ম্যাট্রিক্স এন্ট্রি; --device=/dev/kfd নেই; কোনো AMD সার্টিফিকেট ভলিউম নেই। জবটি build_tools/ci/build.py তে পাঠানো হয়, যা হলো কনফিগারেশন-অ্যাজ-ডেটা ড্রাইভার এবং এটি অন্য সব CI ম্যাট্রিক্স এন্ট্রির সাথে শেয়ার করা হয়:
- run: |
"$GITHUB_WORKSPACE"/openxla/xla/build_tools/ci/build.py \
--build="${ { matrix.job_info.name } }_github_actions"
XLA_LINUX_X86_GPU_ROCM_GITHUB_ACTIONS বিল্ডটি build_tools/ci/build.py তে নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:
Build(
type_=BuildType.XLA_LINUX_X86_GPU_ROCM_GITHUB_ACTIONS,
repo="openxla/xla",
configs=("warnings", "rbe_linux_cpu", "rocm_clang_hermetic"),
target_patterns=_XLA_DEFAULT_TARGET_PATTERNS,
build_tag_filters=rocm_tag_filter,
test_tag_filters=rocm_tag_filter,
options={**_DEFAULT_BAZEL_OPTIONS, "//xla/tsl:ci_build": True},
subcommand="build",
)
কনফিগারেশনের বিবরণ:
-
subcommand="build"— কোনো টেস্ট চালানো হয় না। -
configs=("warnings", "rbe_linux_cpu", "rocm_clang_hermetic")— এই বিল্ডটি সিপিইউ আরবিই পুল (কোনো জিপিইউ ওয়ার্কারের প্রয়োজন নেই) এবংrocm_clang_hermeticকনফিগারেশন ব্যবহার করে, যা/opt/rocmউপস্থিত থাকার উপর নির্ভর না করে একটি হারমেটিক ROCm + Clang টুলচেইন নিয়ে আসে। -
rocm_tag_filterrocm_ci.ymlদ্বারা ব্যবহৃত রানটাইম ফিল্টার সেটের অনুরূপ, সাথে একটি সুস্পষ্ট"gpu"include যুক্ত করা হয়েছে, কারণbuild.pyফাইলের আওতায়rocm_tag_filters.shস্ক্রিপ্টটি নেই।
build.py হলো মূলত একটি কনফিগারেশন-ভিত্তিক ডেটা ফ্যাক্টরি: এটি প্রতি বিল্ডে তিনটি বেজেল কমান্ড নির্গত করে — ড্রাই-রান ( --nobuild ) রিট্রাই, আসল বিল্ড, এবং bazel analyze-profile profile.json.gz :
def commands(self) -> List[List[str]]:
cmds = []
cmds.extend(self.extra_setup_commands)
if not (macos_build or windows_build):
cmds.append(retry(self.bazel_command(subcommand="build",
extra_options=("--nobuild",))))
cmds.append(self.bazel_command(subcommand=self.subcommand))
cmds.append(["bazel", "analyze-profile", "profile.json.gz"])
return cmds
ড্রাই-রান-দেন-বিল্ড প্যাটার্নটি প্যাকেজ রি-বিল্ড না করেই ক্ষণস্থায়ী প্যাকেজ-ফেচ ব্যর্থতাগুলো পুনরায় চেষ্টা করার সুযোগ দেয়।
এই পর্যায়টি নিশ্চিত করে যে GPU রানার অনুপলব্ধ থাকলেও কম্পাইলেশন রিগ্রেশনগুলো ধরা পড়ে।
স্যানিটাইজার সমর্থন
build_tools/rocm/rocm_xla.bazelrc ফাইলটিতে ASan এবং TSan কনফিগারেশনও ঘোষণা করা হয়েছে:
build:tsan --strip=never
build:tsan --copt -fsanitize=thread
build:tsan --copt -g
build:tsan --copt -fno-omit-frame-pointer
build:tsan --linkopt -fsanitize=thread
build:tsan --linkopt -g
build:tsan --//build_tools/rocm:sanitizer=tsan
build:tsan --test_env=TSAN_OPTIONS=suppressions=build_tools/rocm/tsan_ignore_list.txt:…
build:tsan --run_under=//build_tools/rocm:sanitizer_wrapper
build:asan --test_env=ASAN_OPTIONS=suppressions=build_tools/rocm/asan_ignore_list.txt:use_sigaltstack=0
build:asan --test_env=LSAN_OPTIONS=suppressions=build_tools/rocm/lsan_ignore_list.txt:use_sigaltstack=0
build:asan --//build_tools/rocm:sanitizer=asan
build:asan --run_under=//build_tools/rocm:sanitizer_wrapper
টেস্ট অ্যাকশনের রানফাইলগুলোতে উপযুক্ত সাপ্রেশন ফাইলটি নিয়ে আসার জন্য sanitizer_wrapper ফাইলগ্রুপের select({"asan": [...], "tsan": [...]}) ফাংশনটি //build_tools/rocm:sanitizer স্ট্রিং ফ্ল্যাগটি ব্যবহার করে।
এই কনফিগারেশনগুলো বর্তমানে rocm_ci.yml দ্বারা ব্যবহৃত হয় না; এগুলো অ্যাড-হক আহ্বান এবং ডাউনস্ট্রিম পাইপলাইনের জন্য উপলব্ধ।
কার্য সম্পাদন প্রবাহ
openxla/xla তে একটি সাধারণ PR ল্যান্ড করার ক্ষেত্রে:
PR commit
│
├─► .github/workflows/ci.yml ───────────────► matrix of CPU/GPU/ROCm builds
│ │
│ └─► XLA Linux x86 GPU ROCm
│ └─► build_tools/ci/build.py
│ └─► bazel build (nobuild → real)
│ configs: warnings + rbe_linux_cpu +
│ rocm_clang_hermetic
│ tag filter: rocm_tag_filter (compile-only)
│
└─► .github/workflows/rocm_ci.yml ──────────► AMD GPU runner
│
├─► rocm-config: pin Docker image digest
│
├─► jax (1 GPU)
│ └─► jax/ci/run_bazel_test_rocm_rbe.sh
│ └─► bazel test --config=single_gpu …
│ override_module=xla=<this PR>
│ EngFlow RBE
│
└─► xla (1 GPU)
├─► wget execute_ci_build_upstream.sh from ROCm/xla
├─► bazel test --config=rocm_ci --config=rocm_rbe
│ --config=ci_single_gpu
│ (dynamic scheduling, parallel_gpu_execute lock,
│ flock per CUDA_VISIBLE_DEVICES, 3 retries)
└─► bazel test --config=rocm_ci --config=rocm_rbe
--config=ci_rocm_cpu
(200-way local, sanitizer_wrapper, no GPU
required but exercises GPU-tagged tests on CPU)
যদি কোনো কিছু ব্যর্থ হয়:
- একটি EngFlow লিঙ্ক (
<a href="https://wardite.cluster.engflow.com/invocation/">https://wardite.cluster.engflow.com/invocation/</a><UUID>) Bazel দ্বারা প্রিন্ট করা হয়; এটি অ্যাকশন লগ, ক্যাশ হিট এবং প্রতি-পরীক্ষার stdout দেখার জন্য আদর্শ স্থান। - প্রোফাইল ডেটা
/tf/pkg/profile.json.gzএ যায় (এই পাথটি AMD স্ক্রিপ্টগুলিতে হার্ডকোড করা আছে; কন্টেইনারের--tmpfsএবং/tf/pkgডিরেক্টরিটি হলো সেই জায়গা যেখানে Bazel,bazel analyze-profileএর জন্য টাইমিং ডেটা লেখে)। - প্রতিটি জব লগের শীর্ষে
lscpuএবংrocminfoআউটপুট থাকে, যা প্রায়শই "GPU-টি কন্টেইনারের কাছে আসলেই দৃশ্যমান কিনা" এই বিষয়টি যাচাই করার জন্য যথেষ্ট।
রক্ষণাবেক্ষণ এবং আপডেট
সাধারণ সম্পাদনা এবং সেগুলি কোথায় করতে হয়:
| লক্ষ্য | ফাইল |
|---|---|
| ROCm সংস্করণ বাম্প করুন | .github/workflows/rocm_ci.yml , rocm-config ধাপ — sha256 ডাইজেস্ট আপডেট করুন |
| বেস ট্যাগ ফিল্টার যোগ/অপসারণ করুন | build_tools/rocm/rocm_tag_filters.sh |
| কম্পাইল-অনলি ROCm পর্যায়টি পুনরায় টিউন করুন | build_tools/ci/build.py , XLA_LINUX_X86_GPU_ROCM_GITHUB_ACTIONS ব্লক + rocm_tag_filter টাপল |
| একক-জিপিইউ সুইপ থেকে পরীক্ষা যোগ/বাদ দিন | build_tools/rocm/rocm_xla.bazelrc , test:xla_sgpu |
| একটি পরীক্ষাকে মাল্টি-জিপিইউতে উন্নীত করুন | build_tools/rocm/rocm_xla.bazelrc , test:xla_mgpu , এবং নিশ্চিত করুন যে এতে multi_gpu ট্যাগটি আছে। |
| EngFlow এন্ডপয়েন্ট বা অথোরাইজেশন পাথ পরিবর্তন করুন | build_tools/rocm/rocm_xla.bazelrc , build:rocm_rbe লাইনগুলো এবং rocm_ci.yml এর volumes: ট্যাগগুলো। |
| প্রতি-পরীক্ষা বিচ্ছিন্নকরণ আরও কঠোর করুন | build_tools/rocm/parallel_gpu_execute.sh |
| JAX-সাইড বিল্ড ফ্ল্যাগগুলি সামঞ্জস্য করুন | JAX-এর ci/run_bazel_test_rocm_rbe.sh কল করে rocm_ci.yml এ jax ধাপ |
| আপস্ট্রিম ড্রাইভার স্ক্রিপ্ট সামঞ্জস্য করুন | এটি ROCm/xla এর rocm-dev-infra ব্রাঞ্চে ( build_tools/rocm/execute_ci_build_upstream.sh ) থাকে — এই রিপোজিটরিতে নয়। |
build.py তে কোনো পরিবর্তন করার সাথে সাথে build_tools/ci/golden_commands.txt ফাইলটি পুনরায় তৈরি করা উচিত (রিডমি ফাইলে এর পদ্ধতি ব্যাখ্যা করা আছে: PYTHONDONTWRITEBYTECODE=1 python3 build.py --dump_commands > golden_commands.txt )। গোল্ডেন কমান্ডগুলো হলো ডকুমেন্টেশন, এগুলো কোনো প্রয়োগ নয় — CI এগুলোর সাথে ডিফারেন্স (diff) দেখে না — কিন্তু রিভিউয়াররা বাস্তবায়িত কমান্ড লাইনগুলো দেখার জন্য এগুলো পড়েন।
তথ্যসূত্র
- ওয়ার্কফ্লো:
.github/workflows/rocm_ci.yml,.github/workflows/ci.yml - ROCm-এর জন্য নির্দিষ্ট স্ক্রিপ্ট এবং bazelrc:
build_tools/rocm/ - শেয়ার্ড সিআই ড্রাইভার:
build_tools/ci/build.py - ট্যাগ-ফিল্টার সহায়ক:
build_tools/rocm/rocm_tag_filters.sh - GPU লক সহায়কসমূহ:
build_tools/rocm/parallel_gpu_execute.sh,build_tools/ci/parallel_gpu_execute.sh - স্যানিটাইজার উপেক্ষা তালিকা:
build_tools/rocm/{asan,lsan,tsan}_ignore_list.txt - আপস্ট্রিম-ফর্ক ড্রাইভার স্ক্রিপ্ট (বাহ্যিক):
rocm-dev-infraব্রাঞ্চেরROCm/xla, ফাইলbuild_tools/rocm/execute_ci_build_upstream.sh - EngFlow ক্লাস্টার (RBE + BES):
grpcs://wardite.cluster.engflow.com