StableHLO সামঞ্জস্য

StableHLO হল HLO/MHLO দ্বারা অনুপ্রাণিত একটি পশ্চাদগামী সামঞ্জস্যপূর্ণ ML কম্পিউট অপসেট। এই দস্তাবেজটি ব্যাখ্যা করে যে সামঞ্জস্যের গ্যারান্টির ধরন এবং ব্যাপ্তি যা StableHLO প্রদান করে, সামঞ্জস্য RFC- তে প্রতিষ্ঠিত প্রক্রিয়ার উপর ভিত্তি করে।

সংস্করণ

StableHLO এর বর্তমান সংস্করণ Version.h এ পাওয়া যাবে।

StableHLO অপসেট বা StableHLO সিরিয়ালাইজেশন ফরম্যাটে পরিবর্তন করার সময় গৌণ সংস্করণটি বাম্প করা হয় এবং প্রতিবার যখন আমরা StableHLO ডাউনস্ট্রিম, অর্থাৎ openxla/xla সংগ্রহস্থলে সংহত করি তখন প্যাচ সংস্করণটি বাম্প করা হয়।

গ্যারান্টি

StableHLO v1.0 সামঞ্জস্য RFC অনুসারে, সামঞ্জস্য উইন্ডোতে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

5 বছরের পশ্চাদপদ সামঞ্জস্য: libStablehlo-এর একটি পুরানো সংস্করণ দ্বারা ক্রমিককৃত পোর্টেবল আর্টিফ্যাক্টগুলির একই শব্দার্থ আছে* যখন libStablehlo-এর একটি নতুন সংস্করণ দ্বারা ডিসিরিয়ালাইজ করা হয় যদি এই সংস্করণগুলি openxla/stablehlo কমিট থেকে তৈরি করা হয় যা 5 বছরেরও কম সময়ের মধ্যে।

ফরোয়ার্ড সামঞ্জস্যের 2 বছর: libStablehlo-এর একটি নতুন সংস্করণ দ্বারা সিরিয়াল করা পোর্টেবল আর্টিফ্যাক্টগুলির একই শব্দার্থ আছে* যখন libStablehlo-এর একটি পুরানো সংস্করণ দ্বারা ডিসিরিয়ালাইজ করা হয় যদি এই সংস্করণগুলি openxla/stablehlo কমিট থেকে তৈরি করা হয় যা 2 বছরেরও কম সময়ের ব্যবধানে, যদি না প্রোগ্রামটি হয় পুরানো সংস্করণ থেকে চালু নতুন বৈশিষ্ট্য ব্যবহার করে.

* StableHLO প্রোগ্রামগুলি সামঞ্জস্যপূর্ণ API-এর মাধ্যমে পোর্টেবল আর্টিফ্যাক্টে/থেকে রূপান্তরিত হয় এবং এই প্রোগ্রামগুলির শব্দার্থবিদ্যা StableHLO স্পেক দ্বারা সংজ্ঞায়িত করা হয়। সামঞ্জস্যের এই সংজ্ঞা দ্বারা কভার করা হয়নি তার উদাহরণ দেখতে "আউট অফ স্কোপ" বিভাগটি দেখুন।

এপিআই

পোর্টেবল আর্টিফ্যাক্টগুলি হয় stablehlo-translate টুল ব্যবহার করে তৈরি করা যেতে পারে, অথবা সরাসরি C++ বা Python API-এ। #.#.# ফরম্যাটে লেখা একটি আর্টিফ্যাক্ট লিখতে সিরিয়ালাইজেশন StableHLO এর একটি লক্ষ্য সংস্করণ প্রয়োজন (বর্তমান সংস্করণের জন্য Version.h দেখুন)। যেহেতু প্যাচ সংস্করণগুলি সামঞ্জস্যকে প্রভাবিত করে না, তাই সিরিয়ালাইজেশনের সময় নন-জিরো প্যাচ সংস্করণের সাথে যেকোন লক্ষ্য ডিফল্ট শূন্য হয়ে যায়। ডিসিরিয়ালাইজেশন একটি আর্টিফ্যাক্ট পড়ার জন্য StableHLO এর বর্তমান সংস্করণ ব্যবহার করে।

stablehlo-translate

এটি একটি পোর্টেবল আর্টিফ্যাক্ট তৈরি এবং পড়ার সবচেয়ে সহজ উপায়।

# Write a StableHLO program to a portable artifact
$ stablehlo-translate --serialize file.mlir --target=0.9.0 > portable_artifact.mlir.bc

# Read StableHLO portable artifact
$ stablehlo-translate --deserialize portable_artifact.mlir.bc

সি++

প্রোগ্রাম্যাটিক ওয়ার্কফ্লোগুলির জন্য, StableHLO নিম্নলিখিত সামঞ্জস্যপূর্ণ API প্রদান করে:

// From: #include "stablehlo/api/PortableApi.h"

// Get the current StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getCurrentVersion();

// Get the minimum supported StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getMinimumVersion();

// From:  #include "stablehlo/dialect/Version.h"

// CompatibilityRequirement is used to get a viable target version to use for
// `serializePortableArtifact` given a compatibility requirement specified as
// a duration.
//
// New enum values can be added per use case.
//
// Values represent a minimum requirement, i.e. WEEK_4 will return a >=4w
// old version, the specific implementation detail can be updated at any time
// by the community as long as it satisfies the requirement.
//
// Given that integration into XLA is not immediate, coarse intervals work
// better than providing a specific date.
enum class CompatibilityRequirement {
  NONE = 0,     // No compat requirement, use latest version.
  WEEK_4 = 1,   // 1 month requirement
  WEEK_12 = 2,  // 3 month requirement
  MAX = 3,      // Maximum compat, use minimum supported version
};

// Get a viable target version to use for `serializePortableArtifact` for a
// given compatibility requirement. See `CompatibilityRequirement` for
// details.
Version::fromCompatibilityRequirement(CompatibilityRequirement requirement);

// From: #include "stablehlo/dialect/Serialization.h"

// Write a StableHLO program to a portable artifact
// Writes a stable payload for `module` to `os`. If compatibility with a
// previous version of StableHLO is required, provide the required version
// string `#.#.#` for `targetVersion`.
//
// Can fail if `module` cannot be expressed in the `targetVersion` version of
// StableHLO, e.g. if it's using new or removed features, or if it involves
// unsupported dialects.
LogicalResult serializePortableArtifact(ModuleOp module,
                                        StringRef targetVersion,
                                        raw_ostream& os);

// Read StableHLO portable artifact
//
// Can fail if `sourceStr` cannot be expressed in the current version of
// StableHLO, e.g. if it's using incompatible features. Returns nullptr if
// `sourceStr` is invalid or fails to deserialize.
OwningOpRef<ModuleOp> deserializePortableArtifact(StringRef sourceStr,
                                                  MLIRContext* context);

সম্পূর্ণ API-এর জন্য stablehlo/api/PortableApi.h এবং stablehlo/dialect/Serialization.h দেখুন।

এই API গুলির উদাহরণের জন্য StablehloTranslateMain.cpp দেখুন।

পাইথন

StableHLO এছাড়াও C++ সামঞ্জস্যপূর্ণ API তে পাইথন বাইন্ডিং প্রদান করে:

class StablehloCompatibilityRequirement(enum.Enum):
  NONE,     # No compat, same as get_current_version
  WEEK_4,   # 1mo compat
  WEEK_12,  # 3mo compat
  MAX       # Max compat, same as get_minimum_version

def get_version_from_compatibility_requirement(requirement : StablehloCompatibilityRequirement) -> str: ...
def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def get_smaller_version(v1 : str, v2 : str) -> str: ...
def get_api_version() -> int: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact_str(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact_str(artifact: bytes) -> str: ...
def eval_module(module : ir.Module, args : List[ir.Attribute])

সম্পূর্ণ Python API-এর জন্য StablehloModule.cpp দেখুন।

পাইথন সিরিয়ালাইজেশন API ব্যবহার করার রাউন্ডট্রিপ উদাহরণের জন্য stablehlo.py > test_serialization_apis দেখুন।

টেস্ট

আমাদের কাছে stablehlo/tests/vhlo- এ একটি সামঞ্জস্যপূর্ণ স্যুট রয়েছে যাতে সমস্ত সমর্থিত StableHLO সংস্করণের জন্য StableHLO ops সিরিয়ালকৃত একটি বিস্তৃত সংকলন জড়িত। প্রতিটি পুল অনুরোধের জন্য, আমরা পশ্চাৎগামী এবং ফরোয়ার্ড সামঞ্জস্য উভয়ই পরীক্ষা করছি - অর্থাৎ স্যুটটিকে লক্ষ্যবস্তু HEAD (ব্যাকওয়ার্ড কম্প্যাটিবিলিটি) ডিসিরিয়ালাইজ করা যেতে পারে, যে সমস্ত সমর্থিত StableHLO সংস্করণ (ফরোয়ার্ড সামঞ্জস্য) লক্ষ্য করে কম্পেনডিয়ামটি সিরিয়ালাইজ করা যেতে পারে, এবং ফলাফলগুলি সিনট্যাক্টিক্যালি। মূল StableHLO প্রোগ্রামের অনুরূপ।

ভবিষ্যতের কাজ

MLIR আপস্ট্রিমে একটি সামঞ্জস্যপূর্ণ স্যুট তৈরি করুন: StableHLO গ্যারান্টিগুলি প্রতিষ্ঠা এবং বজায় রাখার থেকে শিক্ষাগুলি ব্যবহার করে, আমরা MLIR বাইটকোড অবকাঠামো ( #1632 ) এ দুর্ঘটনাজনিত সামঞ্জস্যতা বিচ্ছেদের প্রাথমিক সনাক্তকরণের জন্য MLIR আপস্ট্রিমে একটি সামঞ্জস্য স্যুট দেওয়ার পরিকল্পনা করছি৷

রেফারেন্স বাস্তবায়ন ব্যবহার করুন: এই মুহুর্তে, সামঞ্জস্য পরীক্ষার মধ্যে রয়েছে libStablehlo-এর পুরানো সংস্করণগুলির দ্বারা সিরিয়ালকৃত সামঞ্জস্যতা স্যুটটিকে ডিসিরিয়ালাইজ করা এবং নিশ্চিত করা যে ডিসিরিয়ালাইজেশন সিনট্যাক্টিক্যালি অভিন্ন প্রোগ্রাম তৈরি করে। আমরা এই পরীক্ষাগুলিতে একটি রেফারেন্স বাস্তবায়ন ব্যবহার করার পরিকল্পনা করছি, সিনট্যাক্টিক্যাল পরিচয়ের অত্যধিক কঠিন প্রয়োজনীয়তা শিথিল করে এবং রেফারেন্স বাস্তবায়ন ( #1245 ) ব্যাপকভাবে পরীক্ষা করছি।

সুযোগের বাইরে

নন-পোর্টেবল আর্টিফ্যাক্ট: সামঞ্জস্যের গ্যারান্টি শুধুমাত্র পোর্টেবল আর্টিফ্যাক্টগুলির জন্য প্রদান করা হয় যা একটি খুব নির্দিষ্ট উপায়ে তৈরি করা হয়। অন্যান্য ধরনের শিল্পকর্ম, যেমন StableHLO উপভাষার সুন্দর প্রিন্টেড উপস্থাপনা এমনকি StableHLO উপভাষার বাইটকোড উপস্থাপনা, সামঞ্জস্যের গ্যারান্টি নেই।

অনির্দিষ্ট বৈশিষ্ট্য: আমরা ঐতিহাসিকভাবে StableHLO প্রোগ্রামগুলিতে সমর্থিত বৈশিষ্ট্যগুলিতে অসামঞ্জস্যপূর্ণ পরিবর্তন করতে পারি কিন্তু এখনও StableHLO স্পেসিফিকেশনের অংশ নয়, যেমন আমরা অনিবন্ধিত বৈশিষ্ট্যগুলির জন্য সামঞ্জস্যের গ্যারান্টি প্রদান করি না।

বাগ সামঞ্জস্যতা: যদি libStablehlo-এ বাস্তবায়ন StableHLO স্পেসিফিকেশনের সাথে সাংঘর্ষিক হয়, যেমন যদি VHLO উপভাষায় একটি সংজ্ঞা ভুল হয়, বা StableHLO উপভাষায় একটি যাচাইকারী স্পেকের সাথে মেলে না তাহলে আমরা বেমানান পরিবর্তন করতে পারি।

সাংখ্যিক নির্ভুলতা: StableHLO এর একাধিক অপ্স রয়েছে যার বাস্তবায়ন-সংজ্ঞায়িত নির্ভুলতা ভোক্তাদের এবং এমনকি সংস্করণ জুড়ে একই গ্রাহকের মধ্যে রয়েছে। ফলস্বরূপ, StableHLO সংখ্যাগত নির্ভুলতা সম্পর্কে গ্যারান্টি দেওয়ার লক্ষ্য রাখে না, যদিও এটি ভবিষ্যতে পরিবর্তিত হতে পারে ( #1156 )।

libStablehlo-এর মধ্যে C, C++ এবং Python API-এর জন্য উত্স সামঞ্জস্য একটি উচ্চাকাঙ্খী লক্ষ্য। এই মুহুর্তে, আমরা উত্স সামঞ্জস্যতার গ্যারান্টি অফার করি না, তবে দয়া করে আমাদের জানান যে এটি আপনার জন্য একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে, এবং আমরা এটিকে সমর্থন করার বিষয়ে আলোচনা করতে পারি ( #1247 )।