StableHLO সামঞ্জস্য

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

সংস্করণ

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

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

গ্যারান্টি

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

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

* 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/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 তে পাইথন বাইন্ডিং প্রদান করে:

def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact(artifact: bytes) -> str: ...

সম্পূর্ণ 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 )।