एक साथ काम नहीं करने वाली प्रोसेस (HLO) के लिए निर्देश

  1. HLO में एक साथ काम नहीं करने वाली कार्रवाइयां जोड़ना जटिल होता है (यानी all-reduce-start और all-reduce-done).
  2. एसिंक्रोनस इस्तेमाल के लिए, हो सकता है कि शुरुआत और किया गया स्प्लिट ठीक न हो मामले.

पहली कमी को ध्यान में रखते हुए, हमारा सुझाव है कि हम नई कमियों का एक आखिरी सेट पेश करेंगे एसिंक्रोनस ऑपकोड: 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”/”-हो गया” ऑपकोड.