StableHLO দোভাষী

StableHLO ইন্টারপ্রেটারের মূল লক্ষ্য হল StableHLO opset এর স্পেসিফিকেশন অনুসারে এর শব্দার্থবিদ্যার একটি রেফারেন্স বাস্তবায়ন প্রদান করা। দ্বিতীয় লক্ষ্য হল বাস্তবায়নটি স্পেকটি ঘনিষ্ঠভাবে অনুসরণ করা, কর্মক্ষমতার চেয়ে পাঠযোগ্যতাকে অগ্রাধিকার দেওয়া, এমনকি Convolution , Gather / Scatter এবং DotGeneral এর মতো সবচেয়ে জড়িত ক্রিয়াকলাপগুলির শব্দার্থবিদ্যায় অতিরিক্ত স্পষ্টতা প্রদান করা।

এই মুহূর্তে, OpenXLA ৯৬টি নির্দিষ্ট StableHLO অপশনের মধ্যে ৯১টির ব্যাখ্যা সমর্থন করে। বাকি ২টি অপশন ( RngOp এবং RngBitGeneratorOp ) এর শব্দার্থবিদ্যা spec.md তে নথিভুক্ত করা হয়েছে এবং কীভাবে এগিয়ে যেতে হবে সে সম্পর্কে প্রাথমিক তদন্ত সম্পন্ন করেছে (অপশনের সম্পূর্ণ তালিকা এবং এর সর্বশেষ অবস্থা জানতে status.md দেখুন)। এই চূড়ান্ত বর্ধিতকরণগুলি প্রয়োজন অনুসারে সম্প্রদায়ের ভিত্তিতে বাস্তবায়িত করা হবে।

ব্যাপ্তি

আমরা StableHLO অপসেটকে ১১টি বিভাগে শ্রেণীবদ্ধ করেছি যার মধ্যে মোট ১১৮টি অপশন রয়েছে ( পরিশিষ্ট দেখুন)। রেফারেন্স বাস্তবায়ন কর্মধারা StableHLO স্পেসিফিকেশনে সংজ্ঞায়িত ১০০% StableHLO অপশনের জন্য একটি দোভাষী বাস্তবায়নের কাজ সংগঠিত করে। আমরা StableHLO v1.0-এ এই কর্মধারার সমস্ত বা প্রায় সমস্ত কাজ সম্পন্ন করার পরিকল্পনা করছি। বর্তমানে একটি স্পেক আছে এমন ৯৬টি অপশনের মধ্যে, আমরা OpenXLA-এর মাধ্যমে ৯১টি অপশন ব্যাখ্যা করতে পারি (বাকি ৫টির জন্য বিশেষ কেস দেখুন)।

স্পেসিফিকেশন

ইন্টারপ্রেটারের প্রধান প্রয়োজনীয়তা হলো স্পেকের সাথে ১:১ সঙ্গতি থাকা। স্পেকের মাধ্যমে একই ধরণের অপারেশনের মাধ্যমে ইন্টারপ্রেটারের মানসম্মতকরণ সম্ভব হয়, যা ইন্টারপ্রেটারের মডুলার, উচ্চমানের বাস্তবায়নের দিকে পরিচালিত করে।

বিশেষ ক্ষেত্রে

বিবিধ

এই বিভাগে পচনশীল অপশন রয়েছে যার ভবিষ্যৎ এই মুহূর্তে অস্পষ্ট। এই বিভাগে তিনটি নির্দিষ্ট অপশন রয়েছে যা দোভাষী এই মুহূর্তে সমর্থন করে না:

  • RngOp
  • RngBitGeneratorOp

RngOp এবং RngBitGeneratorOp MHLO অপশনে বিভক্ত করা যেতে পারে, কিন্তু এই অপশনটি একটি XlaRngGetAndUpdateStateOp প্রবর্তন করে যা একটি MHLO নির্দিষ্ট অপশন। এই দুটি অপশনের সহায়ক ব্যাখ্যা হল একটি WIP।

এই বিভাগের অবশিষ্ট অপশনগুলিকে StableHLO অপশনে রূপান্তর করার টুলটি hlo_expand_main.cc তে অবস্থিত, যা ইন্টারপ্রেটার সমর্থন করে।

HLO তে নেই

নির্দিষ্ট অপশন ছাড়াও, এই বিভাগে ৮টি অনির্দিষ্ট অপশন রয়েছে ( StableHLO অপশন বিভাগ দেখুন) যা StableHLO থেকে সরানোর পরিকল্পনা করা হয়েছে। এই অপশনগুলির বেশিরভাগেরই mhlo তে বিদ্যমান পাস রয়েছে যা সেগুলিকে StableHLO সমতুল্য অপশনে রূপান্তর করতে পারে।

এই বিভাগের অবশিষ্ট অপশনগুলিকে ইন্টারপ্রেটার দ্বারা সমর্থিত সমতুল্য StableHLO অপশনে রূপান্তর করার টুলটি mlir-hlo-opt.cc তে অবস্থিত।

পরিমাণ নির্ধারণ

কোয়ান্টাইজড টাইপ সহ stablehlo.constant অপারেশনের জন্য ইন্টারপ্রেটার সাপোর্ট অসমর্থিত এবং #1691 এর মাধ্যমে ট্র্যাক করা হয়।

ব্যবহারের নির্দেশাবলী

রেফারেন্স ইন্টারপ্রেটার তৈরি করা

দোভাষীটি Bazel অথবা CMake (পছন্দসই) এর মাধ্যমে তৈরি এবং পরীক্ষা করা যেতে পারে। সম্পূর্ণ নির্দেশাবলীর জন্য, README.md দেখুন।

ব্যাজেল:

bazel build //...

সিমেক:

mkdir -p build && cd build

cmake .. -GNinja \
  -DLLVM_ENABLE_LLD="$LLVM_ENABLE_LLD" \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_ASSERTIONS=On \
  -DMLIR_DIR=${PWD}/../llvm-build/lib/cmake/mlir

ইন্টারপ্রেটার চালানোর জন্য, আমাদের কাছে MLIR-এ লেখা StableHLO প্রোগ্রামগুলি ব্যাখ্যা করার জন্য একটি অনুবাদ টুল রয়েছে।

stablehlo-translate --interpret <path/to/program>

দোভাষীর উপভাষা

Interpreter ডায়ালেক্টে ইন্টারপ্রেটার সম্পর্কিত বিভিন্ন ইউটিলিটি অপশন রয়েছে। বিশেষ করে, interpreter.run_parallel (op শব্দার্থবিদ্যা এবং উদাহরণ ব্যবহারের জন্য InterpreterOps.td দেখুন) op ডিস্ট্রিবিউশন অপশনের ব্যাখ্যার অনুমতি দেয় এবং সম্প্রদায়ের চাহিদার উপর ভিত্তি করে আরও ইউটিলিটি পরিকল্পনা যোগ করা হয়।

চেক ডায়ালেক্ট

Check ডায়ালেক্টটি ইন্টারপ্রেটার রানটাইম মানগুলিকে প্রত্যাশিত মানের সাথে তুলনা করতে ব্যবহৃত হয়। StableHLO প্রোগ্রামের আউটপুটগুলি বিভিন্ন চেক অপের মাধ্যমে পরীক্ষা করা যেতে পারে (অপ সেমান্টিক্স এবং উদাহরণ ব্যবহারের জন্য CheckOps.td দেখুন)।

লেখার পরীক্ষার প্রোগ্রাম

আমরা LLVM এর lit টুল ব্যবহার করে ইন্টারপ্রেটারের আউটপুটের সাথে পার্থক্য নির্ণয়ের জন্য জেনারেটেড ফাইল রান এবং তুলনা করি (যেমন tests দেখুন stablehlo/tests/interpret )।

AddOp পরীক্ষা করা হচ্ছে ( interpret_add.mlir থেকে নমুনা):

// RUN: stablehlo-translate --interpret %s

func.func @add_op_scalar() {
  %0 = stablehlo.constant dense<2> : tensor<i4>
  %1 = stablehlo.constant dense<3> : tensor<i4>
  %2 = stablehlo.add %0, %1 : tensor<i4>
  check.expect_eq_const %2, dense<5> : tensor<i4>
  func.return
}

ডিস্ট্রিবিউশন বিভাগে পরীক্ষামূলক অপারেশনের জন্য এটি interpreter.run_parallel ইউটিলিটি op এর মাধ্যমে চালানো প্রয়োজন।

AllReduceOp পরীক্ষা করা হচ্ছে ( all_reduce.mlir থেকে নমুনা):

// RUN: stablehlo-translate --interpret %s

module @cross_replica {
  func.func public @all_reduce(%operand : tensor<4xi64>) -> tensor<4xi64> {
    %result = "stablehlo.all_reduce"(%operand) ({
      ^bb0(%arg0: tensor<i64>, %arg1: tensor<i64>):
        %0 = stablehlo.add %arg0, %arg1 : tensor<i64>
        stablehlo.return %0 : tensor<i64>
    }) {
      replica_groups = dense<[[0, 1]]> : tensor<1x2xi64>,
      channel_handle = #stablehlo.channel_handle<handle = 0, type = 0>
    } : (tensor<4xi64>) -> tensor<4xi64>
    return %result : tensor<4xi64>
  }
  func.func public @main() {
    %inputs0 = stablehlo.constant dense<[1, 2, 3, 4]> : tensor<4xi64>
    %inputs1 = stablehlo.constant dense<[5, 6, 7, 8]> : tensor<4xi64>
    %results:2 = "interpreter.run_parallel"(%inputs0, %inputs1) {
      programs=[[@all_reduce], [@all_reduce]]
    } : (tensor<4xi64>, tensor<4xi64>) -> (tensor<4xi64>, tensor<4xi64>)
    check.expect_eq_const %results#0, dense<[6, 8, 10, 12]> : tensor<4xi64>
    check.expect_eq_const %results#1, dense<[6, 8, 10, 12]> : tensor<4xi64>
    func.return
  }
}

StableHLO ডিবাগ করা হচ্ছে

StableHLO বিল্ড ধাপগুলি অনুসরণ করে, stablehlo/tools এ টুলের জন্য StableHLO বাইনারিগুলি /build/bin এ থাকা উচিত। কোডটি ধাপে ধাপে সম্পন্ন করার জন্য GDB-এর মতো সাধারণ ডিবাগিং টুল ব্যবহার করা যেতে পারে:

gdb --args ./build/bin/stablehlo-translate -allow-unregistered-dialect --interpret ./stablehlo/tests/interpret/<test>.mlir

পরিশিষ্ট

বিবিধ অপারেশন রূপান্তর করুন

# batch_norm_grad
hlo-expand --batch_norm_grad_expander <path/to/hlo_module>

# batch_norm_inference
hlo-expand --batch_norm_inference_expander <path/to/hlo_module>

# batch_norm_training
hlo-expand --batch_norm_training_expander <path/to/hlo_module>

# cholesky
hlo-expand --cholesky_expander <path/to/hlo_module>

# constant
# Supported in StableHLO interpreter.

# fft
# TBD

# iota
# Supported in StableHLO interpreter.

# rng
# TBD

# rng_bit_generator
# TBD

# triangular_solve
hlo-expand --triangular_solve_expander <path/to/hlo_module>

HLO Ops-এ নয় রূপান্তর করুন

# dot
mlir-hlo-opt -mhlo-legalize-dot-to-dot-general <path/to/input>

# einsum
mlir-hlo-opt -mhlo-legalize-einsum-to-dot-general <path/to/input>

# torch_index_select
mlir-hlo-opt -mhlo-legalize-torch-index-select-to-gather <path/to/input>

# unary_einsum
mlir-hlo-opt --canonicalize -mhlo-legalize-einsum-to-dot-general <path/to/input>

StableHLO Ops বিভাগ

বিভাগ স্মৃতিবিদ্যা মোট
১১৯
নিয়ন্ত্রণ প্রবাহ সবশেষে, কেস, যদি, অপ্টিমাইজেশন_বাধা, যখন
ডেটা মুভমেন্ট ব্রডকাস্ট_ইন_ডিম, কনক্যাটেনেট, ডায়নামিক_স্লাইস, ডায়নামিক_আপডেট_স্লাইস, জড়ো করা, প্যাড, পুনঃআকৃতি দেওয়া, বিপরীত করা, বিক্ষিপ্ত করা, স্লাইস করা, সাজানো, স্থানান্তর করা ১২
বিতরণ সব_জড়িত, সব_হ্রাস, সব_থেকে_সকল, সমষ্টিগত_অনুমতি, ইনফিড, আউটফিড, পার্টিশন_আইডি, রিকভি, রিডুস_স্ক্যাটার, রেপ্লিকা_আইডি, পাঠান ১১
গতিশীলতা ডাইনামিক_ব্রডকাস্ট_ইন_ডিম, ডাইনামিক_কনভ, ডাইনামিক_গ্যাদার, ডাইনামিক_আইওটা, ডাইনামিক_প্যাড, ডাইনামিক_রিশেপ, গেট_ডাইমেনশন_সাইজ, রিয়েল_ডাইনামিক_স্লাইস, সেট_ডাইমেনশন_সাইজ
এলিমেন্টওয়াইজ abs, যোগ, এবং, atan2, bitcast_convert, cbrt, ceil, clamp, তুলনা, জটিল, রূপান্তর, কোসাইন, গণনা_নেতৃস্থানীয়_শূন্য, ভাগ, সূচকীয়, সূচকীয়_বিয়োগ_এক, তল, চিত্র, সীমাবদ্ধ, লগ, লগ_প্লাস_এক, লজিস্টিক, মানচিত্র, সর্বাধিক, সর্বনিম্ন, গুণ, নেগেট, না, অথবা, popcnt, শক্তি, বাস্তব, হ্রাস_নির্ভুলতা, অবশিষ্টাংশ, round_nearest_afz, round_nearest_even, rsqrt, নির্বাচন, shift_left, shift_right_arithmetic, shift_right_logical, চিহ্ন, sine, sqrt, বিয়োগ, tan, tanh, xor ৪৮
এক্সটেনসিবিলিটি কাস্টম_কল, গেট_টুপল_এলিমেন্ট, টুপল
বিবিধ ব্যাচ_নর্ম_গ্র্যাড, ব্যাচ_নর্ম_ইনফারেন্স, ব্যাচ_নর্ম_ট্রেনিং, কোলেস্কি, ধ্রুবক, এফএফটি, আইওটিএ, আরএনজি, আরএনজি_বিট_জেনারেটর, ত্রিভুজাকার_সমাধান ১০
মডুলারিটি কল, ফাংশন, মডিউল, রিটার্ন
HLO তে নেই সম্প্রচার, ক্রিয়েট_টোকেন, ক্রস-রেপ্লিকা-সাম, ডট, আইনসাম, টর্চ_ইনডেক্স_সিলেক্ট, আনারি_আইনসাম
পরিমাণ নির্ধারণ ইউনিফর্ম_ডিকোয়ান্টাইজ, ইউনিফর্ম_কোয়ান্টাইজ
হ্রাস কনভলিউশন, ডট_জেনারেল, রিডুস, রিডুস_উইন্ডো, সিলেক্ট_এন্ড_স্ক্যাটার