- HLO में एक साथ काम नहीं करने वाली कार्रवाइयां जोड़ना जटिल होता है (यानी
all-reduce-start
औरall-reduce-done
). - एसिंक्रोनस इस्तेमाल के लिए, हो सकता है कि शुरुआत और किया गया स्प्लिट ठीक न हो मामले.
पहली कमी को ध्यान में रखते हुए, हमारा सुझाव है कि हम नई कमियों का एक आखिरी सेट पेश करेंगे
एसिंक्रोनस ऑपकोड: kAsyncStart
, kAsyncUpdate
, और kAsyncDone
. आइडिया
एक सामान्य एसिंक्रोनस ऑपकोड बनाना है, जो किसी भी HLO निर्देश को रैप कर सके.
एसिंक्रोनस रूप से निष्पादित किए जाने वाले वास्तविक ऑपरेशन को इसका उपयोग करके एन्कोड किया जाएगा
एक कंप्यूटेशन जिसे कहते हैं, जिसमें सिर्फ़ निर्देश ही इसके रूट के तौर पर होता है और
पैरामीटर की जानकारी. इन-फ़्लाइट इनपुट/आउटपुट बफ़र हैंडलिंग और एलियासिंग
को किसी भी एसिंक्रोनस ऑपरेशन के लिए शेयर किया जा सकता है. एक साथ काम नहीं करने वाले निर्देश का
इसके बाद, आउटपुट आकार, इनपुट ऑपरेंड, आउटपुट वैल्यू, और किसी भी
इंटरमीडिएट स्टेट, जो async-update
या async-done
के लिए ज़रूरी है
निर्देश.
%async_op {
%param0 = f32[64] parameter(0)
ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=”foo”
}
%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
calls=%async_op
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-start)
ऊपर दिए गए उदाहरण में, अब से सिर्फ़ async-start
को कंप्यूटेशन कहते हैं.
यह जानना आसान नहीं है कि async-done
अपने ऑपरेंड के आधार पर क्या करता है
कॉल की गई कंप्यूटेशन की वैल्यू को ढूंढने के लिए, संबंधित async-start
को ढूंढें.
यह भी नोट करें
कि async-start
उपनाम के आउटपुट टपल में पहला एलिमेंट
ऑपरेंड रहता है, ताकि बफ़र कम से कम एक साथ काम न करने वाले निर्देश तक बना रहे.
इसी तरह, async-done
के आउटपुट वाले दूसरे एलिमेंट का दूसरा नाम और
तीसरा एलिमेंट, कॉन्टेक्स्ट की स्थिति है. इसका इस्तेमाल,
एसिंक्रोनस कार्रवाई. इस तरीके से, कई टेंसर को
एसिंक्रोनस ऑपरेशन इनपुट और/या आउटपुट और एलियासिंग एक जैसे काम करते हैं
तरीका:
%async_op {
%param0 = f32[64] parameter(0)
%param1 = f32[64] parameter(1)
ROOT %op = (f32[32], f32[32]) op(f32[64] %param0, f32[64] %param1),
op_specific_attr=”foo”
}
%async-start = ((f32[64], f32[64]), (f32[32], f32[32]), s32[])
async-start(f32[64] %operand0, f32[64] %operand1),
calls=%async_op
%async-done = (f32[32], f32[32]) async-done(%async-start)
इसके अलावा, ऑप को शून्य या उससे ज़्यादा async-update
में विभाजित किया जा सकता है
इंटरमीडिएट कंप्यूटेशन (हिसाब लगाना) करने वाले चरण. इनपुट/आउटपुट एलियासिंग काम करता है
इसी तरह से, async-update
निर्देश के साथ-साथ हर async-start
और
async-update
निर्देशों में एक ऐसा उपयोगकर्ता होना चाहिए जो कोई दूसरा उपयोगकर्ता हो
async-update
या async-done
:
%async_op {
%param0 = f32[64] parameter(0)
ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=”foo”
}
%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
calls=%async_op
%async-update0 = (f32[64], f32[32], s32[]) async-update(
(f32[64], f32[32], s32[]) %async-start)
%async-update1 = (f32[64], f32[32], s32[]) async-update(
(f32[64], f32[32], s32[]) %async-update0)
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-update1)
सिंटैक्स शुगर
चूंकि, एक अलग कंप्यूटेशन होने से काम एसिंक्रोनस रूप से करना कुछ जटिल है, इसलिए हम यह भी सुझाव देते हैं कि एसिंक्रोनस संक्रियाएं अपने आप प्रिंट और पार्स कर लें, जैसे कि वे प्रथम श्रेणी की हों ऑपकोड. हमारी कोशिश है कि इनमें “-शुरू करें”, “-अपडेट करें”, और “-हो गया” सफ़िक्स का इस्तेमाल किया जाए यह खास तौर पर, अपने-आप कंप्यूटेशन और निर्देश देकर ( प्रत्यय) पार्स करते समय. उदाहरण के लिए, ऊपर दिया गया कोड स्निपेट प्रिटी-प्रिंट किया जा सकता है और दोनों को एक ही निरूपण में पार्स किया जा सकता है:
%op-start = (f32[64], f32[32], s32[]) op-start(f32[64] %operand),
op_specific_attr=”foo”
%op-update0 = (f32[64], f32[32], s32[]) op-update(
(f32[64], f32[32], s32[]) %op-start),
op_specific_attr=”foo”
%op-update1 = (f32[64], f32[32], s32[]) op-update(
(f32[64], f32[32], s32[]) %op-update0)
%op-done = f32[32] op-done((f32[64], f32[32], s32[]) %op-update1)
आसानी से समझ न आने वाली चीज़ें न बनाने के लिए, पुष्टि करने वाला टूल
अगर हम इसके लिए साफ़ तौर पर कोई ऑपकोड तय करें, तो उसे एसिंक्रोनस-स्टार्ट के साथ रैप किया जाएगा
ऑपरेशन शुरू करना ज़रूरी है. यह भी एक एस्केप है
अगर हमारे पास कोई ऐसा निर्देश है जिसके लिए एचएलओ-लेवल ट्रीटमेंट की ज़रूरत हो, तो
ऊपर बताए गए मॉडल के हिसाब से नहीं है. उदाहरण के लिए, एलियासिंग इनपुट/आउटपुट
बफ़र). इसलिए, शुरुआत में, copy-start
/copy-done
,
collective-permute-start
/collective-permute-done
वगैरह का इस्तेमाल जारी रहेगा
नए कोड की जगह फ़र्स्ट-क्लास ऑपकोड
जब तक हम इन कोड को हटाने के लिए कोड को साफ़ नहीं करते, तब तक async-start
/async-done
ऑपकोड
“-start”/”-हो गया” ऑपकोड.