StableHLO দোভাষী

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

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

ব্যাপ্তি

আমরা StableHLO অপসেটকে 11টি বিভাগে শ্রেণীবদ্ধ করেছি যার মধ্যে মোট 118টি অপ্স রয়েছে ( পরিশিষ্ট দেখুন)। রেফারেন্স ইমপ্লিমেন্টেশন ওয়ার্কস্ট্রীম StableHLO স্পেসিফিকেশনে সংজ্ঞায়িত 100% StableHLO অপারেশনের জন্য দোভাষী বাস্তবায়নের কাজকে সংগঠিত করে। আমরা StableHLO v1.0-এ এই ওয়ার্কস্ট্রীমের সমস্ত বা প্রায় সমস্ত কাজ সম্পূর্ণ করার পরিকল্পনা করছি। বর্তমানে যে 96টি অপ্সটির একটি বিশেষ বৈশিষ্ট্য রয়েছে, আমরা 91টি অপ্সকে OpenXLA এর মাধ্যমে ব্যাখ্যা করতে পারি (বাকি 5টির জন্য বিশেষ কেস দেখুন)।

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

দোভাষীর জন্য প্রধান প্রয়োজন হল স্পেকের সাথে 1:1 চিঠিপত্র। স্পেক অনুরূপ অপ্স জুড়ে দোভাষীর প্রমিতকরণের অনুমতি দেয় যা দোভাষীর মডুলার, উচ্চ মানের বাস্তবায়নের দিকে পরিচালিত করে।

বিশেষ কেস

বিবিধ

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

  • FftOp
  • RngOp
  • RngBitGeneratorOp

FftOp বিবিধ হিসাবে শ্রেণীবদ্ধ করা হয়েছে, কিন্তু এই বিভাগের অন্যান্য অপের মত, এই অপের কোন এক্সপেন্ডার পাস নেই এবং StableHLO তে এটিকে সমর্থন করা একটি WIP।

RngOp এবং RngBitGeneratorOp MHLO অপ্স-এ পচে যেতে পারে, কিন্তু পচন একটি XlaRngGetAndUpdateStateOp প্রবর্তন করে যা একটি MHLO নির্দিষ্ট অপ্স। এই দুটি অপের সমর্থনকারী ব্যাখ্যা একটি WIP.

এই বিষয়শ্রেণীতে থাকা অবশিষ্ট অপগুলিকে StableHLO ops-এ রূপান্তর করার টুল যা দোভাষী সমর্থন করে hlo_expand_main.cc- এ থাকে।

HLO তে নেই

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

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

কোয়ান্টাইজেশন

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

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

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

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

বাজেল:

bazel build //...

CMake:

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 (অর্থাৎ শব্দার্থবিদ্যা এবং উদাহরণ ব্যবহারের জন্য InterpreterOps.td দেখুন) op ডিস্ট্রিবিউশন অপ্সের ব্যাখ্যার অনুমতি দেয় এবং সম্প্রদায়ের প্রয়োজনের উপর ভিত্তি করে আরও ইউটিলিটি প্ল্যান যোগ করা যায়।

চেক উপভাষা

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

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

আমরা LLVM এর lit টুল ব্যবহার করি এবং দোভাষীর আউটপুটের সাথে পার্থক্য করার জন্য জেনারেট করা ফাইলের সাথে তুলনা করি (উদাহরণস্বরূপ পরীক্ষার জন্য 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 utility 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 অপস

# 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 বিভাগ

ক্যাটাগরি স্মৃতিবিদ্যা মোট
119
নিয়ন্ত্রণ প্রবাহ after_all, case, if, optimization_barrier, while 5
ডেটা মুভমেন্ট broadcast_in_dim, concatenate, dynamic_slice, dynamic_update_slice, gather, pad, reshape, reverse, scatter, slice, sort, transpose 12
বিতরণ all_gather, all_reduce, all_to_all, collective_permute, infeed, outfeed, partition_id, recv, reduce_scatter, replica_id, send 11
গতিশীলতা dynamic_broadcast_in_dim, dynamic_conv, dynamic_gather, dynamic_iota, dynamic_pad, dynamic_reshape, get_dimension_size, real_dynamic_slice, set_dimension_size 9
উপাদান অনুসারে abs, add, and, atan2, bitcast_convert, cbrt, ceil, clamp, compare, complex, convert, cosine, count_leading_zeros, divide, exponential, exponential_minus_one, floor, imag, is_finite, log, log_plus_one, লজিস্টিক, মানচিত্র, সর্বোচ্চ, মিনিমাম গুন, নেগেট, না, বা, popcnt, শক্তি, বাস্তব, হ্রাস_নির্ভুলতা, অবশিষ্ট, round_nearest_afz, round_nearest_even, rsqrt, নির্বাচন, shift_left, shift_right_rithmetic, shift_right_logical, চিহ্ন, সাইন, sqrt, বিয়োগ, ট্যান, tanh, xor 48
এক্সটেনসিবিলিটি কাস্টম_কল, get_tuple_element, tuple 3
বিবিধ batch_norm_grad, batch_norm_inference, batch_norm_training, cholesky, constant, fft, iota, rng, rng_bit_generator, triangular_solve 10
মডুলারিটি কল, ফাংশন, মডিউল, রিটার্ন 4
HLO তে নেই ব্রডকাস্ট, তৈরি_টোকেন, ক্রস-প্রতিলিপি-সম, ডট, ইন্সাম, টর্চ_ইনডেক্স_সিলেক্ট, ইউনারি_ইন্সাম 8
কোয়ান্টাইজেশন uniform_dequantize, uniform_quantize 2
হ্রাস convolution, dot_general, reduce, reduce_window, select_and_scatter 5