2025, Oct 20 20:31
uv में aarch64/x86_64 पर PyTorch CUDA 12.4/12.8 चुनना: environment markers के साथ विश्वसनीय तरीका
uv में environment markers से PyTorch के CUDA 12.4/12.8 बिल्ड x86_64 व aarch64 पर सही चुनें और extras/required-environments से होने वाली resolver समस्याओं से बचें.
कई आर्किटेक्चर पर CUDA के अलग‑अलग संस्करणों को लक्ष्य बनाना अक्सर आसान लगता है—जब तक रिज़ॉल्वर असहमत न हो जाए। एक आम स्थिति है: Linux x86_64 जिसे CUDA 12.4 पर ही रहना है, जबकि aarch64 CUDA 12.8 का उपयोग करता है। PyTorch arm64 के लिए CUDA 12.4 वाले व्हील जारी नहीं करता, इसलिए शुरुआत में ही रिज़ॉल्वर को उस संयोजन की कोशिश से दूर रखना जरूरी है।
समस्या को दोहराना
नीचे की सेटअप प्लेटफ़ॉर्म के अनुसार सही CUDA बिल्ड चुनाने के लिए extras और required-environments पर निर्भर करती है। इसके बावजूद, uv aarch64 के लिए CUDA 12.4 वाला व्हील रिज़ॉल्व करने की कोशिश करता है और असफल हो जाता है।
[project]
name = "uv_extras_case"
version = "0.1.1"
description = ""
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
[tool.uv]
conflicts = [
    [{extra="cu128"}, {extra="cu124"}]
]
required-environments = [
    "sys_platform == 'linux' and platform_machine == 'x86_64'  and extra == 'cu124'",
    "sys_platform == 'linux' and platform_machine == 'aarch64' and extra == 'cu128'",
]
index-strategy = "unsafe-best-match"
[project.optional-dependencies]
cu124 = [
    "torch==2.6.0+cu124",
]
cu128 = [
    "torch==2.7.0+cu128",
]
[[tool.uv.index]]
name = "pt-cu128"
url = "https://download.pytorch.org/whl/cu128"
[[tool.uv.index]]
name = "pt-cu124"
url = "https://download.pytorch.org/whl/cu124"
असल में दिक्कत क्या है
रिज़ॉल्वर ऐसे आगे बढ़ता है मानो required-environments में दिया गया extra उसे असंगत संयोजनों की पड़ताल करने से नहीं रोकता। नतीजतन, जब uv torch==2.6.0+cu124 लेने की कोशिश करता है—जिसके उस प्लेटफ़ॉर्म के लिए व्हील हैं ही नहीं—तो aarch64 के लिए बाध्यताओं का सेट असंतुष्ट हो जाता है और विफलता दिखती है।
कोई समाधान नहीं मिला … क्योंकि torch==2.6.0+cu124 के पास … aarch64 … संगत व्हील नहीं हैं … अतः निष्कर्ष है कि … आवश्यकताएँ असंतुष्ट हैं।
सीधे शब्दों में, केवल required-environments के ज़रिए extras को सीमित करना uv को arm पर torch+cu124 पर विचार करने से नहीं रोकता।
समाधान
Environment marker का उपयोग करके प्लेटफ़ॉर्म प्रतिबंध को निर्भरता की पंक्ति का ही हिस्सा बना दें। इससे uv को साफ़ संकेत मिलता है कि torch+cu124 सिर्फ़ Linux x86_64 पर इंस्टॉल हो सकता है, इसलिए aarch64 पर इसकी कोशिश नहीं की जानी चाहिए।
[project.optional-dependencies]
cu124 = [
    "torch==2.6.0+cu124; sys_platform == 'linux' and platform_machine == 'x86_64'",
]
cu128 = [
    "torch==2.7.0+cu128",
]
इसके बाद uv arm64 पर torch+cu124 को रिज़ॉल्व करने की कोशिश नहीं करेगा, और aarch64 के लिए समाधान अपेक्षा के अनुरूप CUDA 12.8 बिल्ड के साथ आगे बढ़ेगा।
यह क्यों मायने रखता है
क्रॉस‑आर्किटेक्चर वातावरणों में अलग‑अलग निर्भरता ग्राफ़ और इंडेक्स अक्सर साथ आते हैं। यदि किसी विशिष्ट प्लेटफ़ॉर्म‑एक्सेलरेटर जोड़ी के लिए पैकेज प्रकाशित नहीं है, तो रिज़ॉल्वर को इसे आज़माकर खुद समझने देना महँगा और नाज़ुक साबित होता है। निर्भरता लाइन पर ही प्लेटफ़ॉर्म प्रतिबंध लिख देने से असंतुष्ट समाधान से बचाव होता है और आपके वातावरण की परिभाषाएँ स्वयं‑व्याख्यात्मक रहती हैं।
मुख्य बातें
जब कोई पैकेज प्लेटफ़ॉर्म‑विशिष्ट हो, तो उस बाधा को environment markers के साथ सीधे निर्भरता में लिखें। केवल extras और उच्च‑स्तरीय environment चयन पर निर्भर रहने से रिज़ॉल्वर के पास अब भी ग़लत संयोजनों की पड़ताल की गुंजाइश रह जाती है—जैसा torch+cu124 और aarch64 के साथ दिखा। एक छोटा, स्पष्ट मार्कर अस्पष्टता दूर करता है और रिज़ॉल्वर को सीधे साफ़ समाधान तक ले जाता है।