वीएचएलओ बोली क्या है?
VHLO (वर्शन StableHLO) डायलेक्ट का इस्तेमाल, क्रम तय करने और स्थिरता के लिए किया जाता है. यह अलग-अलग प्रोग्राम एलिमेंट का अलग-अलग वर्शन बनाकर किसी तय समय पर StableHLO भाषा का स्नैपशॉट देता है.
वीएचएलओ सिर्फ़ ऐड-ओनली वाली भाषा है. इसमें अलग-अलग वर्शन, टाइप, और एट्रिब्यूट का इस्तेमाल किया जाता है. इसका मतलब है कि जब किसी सुविधा को बोली में जोड़ दिया जाता है, तो उसमें ऐसे बदलाव नहीं किए जा सकते जिससे सिमैंटिक पर असर पड़ता हो.
ऑपरेटर, टाइप या एट्रिब्यूट में किए गए किसी भी बदलाव के लिए, बोली में उसका नया वर्शन जोड़ना ज़रूरी होता है. उदाहरण के लिए, अगर एक काल्पनिक my_op
को StableHLO में 0.9.0 में जोड़ा गया था, लेकिन 0.11.0 में बदला गया था, तो हमारे पास VHLO में ये चीज़ें होंगी:
// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
let arguments = (ins
VHLO_AnyType:$operand
);
let results = (outs VHLO_AnyType:$result);
}
// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
let arguments = (ins
VHLO_AnyType:$operand,
VHLO_AnyAttr:$attr // New attribute added to StableHLO in 0.11.0
);
let results = (outs VHLO_AnyType:$result);
}
StableHLO भाषा में, ऑपरेशन का सिर्फ़ नया वर्शन मौजूद है. मौजूदा उदाहरण में, v0.11.0 पर StableHLO भाषा में सिर्फ़ StableHLO_MyOp
होगा, जिसमें operand
और attr
होंगे. वहीं, VHLO, ऑपर्च्यूनिटी के विकास के हर चरण को कैप्चर करता है.
VHLO क्यों उपयोगी है?
वर्शन वाली बोली की मदद से, हम StableHLO ऑप्टसेट के पिछले वर्शन को टारगेट कर पाते हैं. यह वीएचएलओ भाषा में ऑपरेटर के बीच कन्वर्ज़न के दौरान, आगे और पीछे के साथ काम करने की सुविधा को इकट्ठा करता है.
फ़ॉरवर्ड के साथ काम करने की सुविधा: फ़ॉरवर्ड कंपैटिबिलिटी, वीएचएलओ में बदलकर और ऑपरेशंस को टारगेट वर्शन में डाउनग्रेड करके दी जाती है. अगर किसी VHLO प्रोग्राम में, हर op/type/attr को टारगेट वर्शन में डाउनग्रेड किया जा सकता है, तो यह गारंटी के साथ होता है कि वह उपयोगकर्ता के पास टारगेट वर्शन से बड़ा या उसके बराबर का वर्शन चल रहा है. इस ऐक्सेस को उपयोगकर्ता के पास डीज़लाइज़ करने लायक और StableHLO में बदलने की सुविधा होगी. ऐसा इसलिए, क्योंकि उस समय VHLO के पास उस समय ऑपसेट का स्नैपशॉट होता है.
अगर ऐसे ऑपरेटर या सुविधाओं का इस्तेमाल किया जाता है जो विकल्प के पिछले वर्शन में मौजूद नहीं हैं, तो यह डाउनग्रेड कन्वर्ज़न काम नहीं करेगा. इसका मतलब यह है कि फ़ॉरवर्ड करने की सुविधा, रनटाइम के बजाय प्रोड्यूसर पर काम करती है.
पुराने सिस्टम के साथ काम करने की सुविधा: वीएचएलओ ऑपरेशन को उनके सबसे नए वर्शन (अगर ज़रूरी हो) पर अपग्रेड करके, पुराने वर्शन के साथ काम करने की सुविधा दी जाती है. इसके बाद, ऑपरेशन को StableHLO में बदल दिया जाता है. कम्पैटबिलटी विंडो में मौजूद सभी VHLO प्रोग्राम, StableHLO में अपग्रेड किए जा सकते हैं. इसका मतलब है कि उपभोक्ताओं के अलग-अलग वर्शन, पिछले वर्शन के एक ही VHLO पेलोड को डीसीरियलाइज़ (पार्स) कर सकते हैं.
सबसे अहम बात यह है कि वीएचएलओ को सीरियलाइज़ेशन के पीछे मौजूद रहता है. इसका मतलब है कि एमएल फ़्रेमवर्क (निर्माता) को सिर्फ़ StableHLO ऑपरेशन को टारगेट करना होगा और कंपाइलर बैकएंड (उपभोक्ता) को सिर्फ़ नए वर्शन के साथ काम करने की ज़रूरत होगी. वीएचएलओ को भेजे जाने वाले और उससे मिलने वाले कन्वर्ज़न का रखरखाव, StableHLO रेपो में मौजूद मशीन से किया जाता है.
MLIR बाइटकोड फ़ॉर्मैट के वर्शन
आगे काम करने की क्षमता बनाए रखने के लिए, StableHLO वर्शन से जुड़े MLIR बाइटकोड फ़ॉर्मैट का वर्शन होता है. इसके अलावा,StableHLO के नए वर्शन में, MLIR Bytecode फ़ॉर्मैट के नए वर्शन का इस्तेमाल किया जाएगा. MLIR Bytecode फ़ॉर्मैट के वर्शन का बढ़ने पर, StableHLO की अगली रिलीज़ में माइनर वर्शन का लेवल बढ़ जाएगा और MLIR बाइट कोड फ़ॉर्मैट के नए वर्शन का इस्तेमाल करने के लिए, Version.cpp को अपडेट किया जाएगा.
MLIR Bytecode फ़ॉर्मैट और StableHLO में इसे इस्तेमाल करने की वजह जानने के लिए, bytecode.md देखें.
असंगत बदलावों में योगदान करना
साथ काम करने से जुड़े सभी बदलाव, आरएफ़सी की प्रोसेस से होने चाहिए. इसमें किसी सुविधा को जोड़ना, बंद करना या उसका नाम बदलना शामिल है. आरएफ़सी से मंज़ूरी मिलने के बाद, योगदान के कुछ दिशा-निर्देश यहां दिए गए हैं:
Version.h में वर्शन नंबर बढ़ाएं
VHLO ऑपरेशन, एट्रिब्यूट, टाइप या कन्वर्ज़न को अपडेट करने से पहले, Version.h में माइनर वर्शन नंबर को बढ़ाएं.
जोड़ी गई किसी भी नई VHLO सुविधा के लिए, इस बंप किए गए वर्शन का इस्तेमाल किया जाएगा. उदाहरण के लिए, 0.10.0 --> 0.11.0
को बड़ा करने के बाद, VhloOps.td में एक नया विकल्प
इसका इस्तेमाल करेगा:
VHLO_Op<"abs_v2", "0.11.0", "current">
ज़रूरी VHLO लागू करने और कन्वर्ज़न जोड़ें
किसी नई सुविधा को इंटिग्रेट करने के लिए, ज़रूरत के हिसाब से कोड अलग-अलग होगा. हालांकि, ज़्यादातर मामलों में इन्हें बदलना होगा:
- सभी बदलावों के लिए:
- VhloDialect.td के वर्शन लॉग इन को अपडेट करें
- नए ऑपरेशन के लिए:
- VhloOps.td में Op जोड़ें
- StableHLO → StablehloLegalizeToVhlo.cpp में VHLO कन्वर्ज़न जोड़ें
- VHLO → VhloLegalizeToStablehlo.cpp में StableHLO कन्वर्ज़न जोड़ें
- मौजूदा ऑपरेशन के नए वर्शन के लिए:
- VhloOps.td में Op जोड़ें
- MapStablehloToVhlo.h में, StableHLO को VHLO मैपिंग में अपडेट करना
- VhloToVersion.cpp में, नए और पुराने ऑप वर्शन के बीच कन्वर्ज़न जोड़ें
- नए टाइप या एट्रिब्यूट के लिए:
- टाइप को VhloTypes.td में जोड़ें या एट्रिब्यूट को VhloAttrs.td में जोड़ें
- StableHLO → StablehloLegalizeToVhlo.cpp में VHLO कन्वर्ज़न जोड़ें
- VHLO → VhloLegalizeToStablehlo.cpp में StableHLO कन्वर्ज़न जोड़ें
साथ काम करने से जुड़े सबमिशन का हाल ही का एक उदाहरण, दो तरह के FP8 को जोड़ना है. साथ ही, #1379 में VHLO में, इन्हें लागू करना भी है.
यूनिट टेस्ट जोड़ना / अपडेट करना
असंगत बदलाव का श्रेय सुविधा के सकारात्मक और नकारात्मक दोनों परीक्षणों के साथ-साथ कम्पैटबिलटी यूनिट परीक्षणों के लिए दिया जाता है.
कम्पैटबिलटी यूनिट टेस्टिंग में stablehlo_legalize_to_vhlo.mlir को अपडेट करना शामिल है, ताकि यह पक्का किया जा सके कि VHLO के सबसे नए वर्शन के साथ StableHLO राउंड ट्रिप के साथ-साथ आगे या पीछे के साथ काम करने से जुड़े किसी भी अतिरिक्त टेस्ट की ज़रूरत है या नहीं.
कुछ उदाहरण:
- पुराने सिस्टम के साथ काम करने की सुविधा, पॉज़िटिव टेस्ट: vhlo_to_version_upgrade.mlir
- फ़ॉरवर्ड कम्पैटबिलटी, पॉज़िटिव टेस्ट: vhlo_to_version_downgrade.mlir
- फ़ॉरवर्ड कम्पैटबिलटी, नेगेटिव टेस्ट: vhlo_to_version_downgrade_invalid.0_9_0.mlir
वर्शन के सीरियलाइज़ेशन टेस्ट को जोड़ें
stablehlo_legalize_to_vhlo.mlir
में टेस्ट पॉइंट जोड़ने के बाद, stablehlo_legalize_to_vhlo.0_X_0.mlir
फ़ाइल की एक अलग वर्शन कॉपी बनाएं. साथ ही, .0_X_0.mlir.bc
एक्सटेंशन के साथ बताई गई फ़ाइल का बाइट कोड वर्शन भी बनाएं. फ़ॉरवर्ड और बैकवर्ड के साथ काम करने की क्षमता की जांच के लिए, सही FileCheck लाइनें जोड़ें.
$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc
# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)
#1430 में वर्शन वाले टेस्ट का उदाहरण.