স্থায়ী অটোটিউনিং (শুধুমাত্র GPU)

আমরা কিছু জিপিইউ কার্নেল তৈরি করার জন্য ওপেনএআই ট্রাইটন ব্যবহার করি। ট্রাইটন নির্দিষ্ট কিছু ফিউশনের জন্য দ্রুত জিপিইউ কার্নেল তৈরি করতে দেয়, কিন্তু এই ধরনের প্রতিটি ফিউশনের জন্য আমাদের কিছু প্যারামিটার টিউন করতে হয়।

অনেকগুলো ফিউশন থাকলে এতে অনেক সময় লাগতে পারে, তাই আমরা অন্যান্য কম্পাইলেশন ধাপগুলো স্বাভাবিকভাবে চালানোর পাশাপাশি সেই অটোটিউনিং ফলাফলগুলো লোড করার একটি উপায় রেখেছি। কিছু পরিবর্তন করলেও অটোটিউনিং ক্যাশগুলো তখনও কার্যকর থাকে: যে ফিউশনগুলো ক্যাশে উপস্থিত থাকে, সেগুলো ক্যাশ ব্যবহার করবে এবং বাকিগুলো স্বাভাবিকভাবে অটোটিউন করা হবে।

--xla_gpu_per_fusion_autotune_cache_dir=your/directory

প্রদত্ত ডিরেক্টরিতে প্রতিটি ফিউশনের জন্য একটি করে অটোটিউন ক্যাশে ব্যবহার ও রক্ষণাবেক্ষণ করুন। প্রতিটি স্বতন্ত্র ফিউশনের জন্য একটি করে ফাইল থাকবে।

এই পদ্ধতির প্রধান সুবিধা হলো, আপনি একাধিক XLA রানের (ভিন্ন ভিন্ন মডেলের) জন্য একই ক্যাশ ডিরেক্টরি ব্যবহার করতে পারেন এবং প্রতিটি নতুন ফিউশনের সাথে আপনার ক্যাশ বৃদ্ধি পাবে, যা পরবর্তী রানগুলোকে দ্রুততর করবে। এছাড়াও, একই ক্যাশ ডিরেক্টরিতে একাধিক XLA ইনস্ট্যান্স একযোগে চালানোর জন্য প্রাথমিক সমর্থন রয়েছে।

প্রয়োজন অনুযায়ী XLA বিদ্যমান ফলাফলগুলো পড়বে এবং ফলাফল নির্ধারিত হওয়ার পর নতুন ফলাফল লিখবে।

  • XLA চালানোর আগে ডিরেক্টরিটি অবশ্যই বিদ্যমান থাকতে হবে এবং এটি লেখার যোগ্য হতে হবে।
  • ক্যাশ বাতিলকরণ ব্যবহারকারীকেই পরিচালনা করতে হবে:
    • আপনি যদি খালি ক্যাশে দিয়ে শুরু করতে চান, তাহলে অনুগ্রহ করে একটি খালি ডিরেক্টরি ব্যবহার করুন।
  • XLA সংস্করণ যাচাই ব্যবহারকারীকেই করতে হবে:
    • আপনি যদি XLA-এর বিভিন্ন সংস্করণের জন্য আলাদা ক্যাশে ব্যবহার করতে চান, তাহলে অনুগ্রহ করে ভিন্ন ভিন্ন ডিরেক্টরি ব্যবহার করুন।

ডিফল্টরূপে ক্যাশে বন্ধ থাকে (যখন আপনি প্যারামিটারটি প্রদান করেন না)।

সীমাবদ্ধতা: নিচে বর্ণিত অন্য ক্যাশিং পদ্ধতির সাথে একত্রে এটি ভালোভাবে কাজ করবে এমন কোনো নিশ্চয়তা নেই।

বিকল্প: একটি নির্দিষ্ট HLO থেকে সমস্ত ফলাফল একটি ফাইলে লোড বা ডাম্প করা

এই প্যারামিটারগুলো ব্যবহার করে অটোটিউনিং-এর ফলাফল ডাম্প/লোড করা যাবে:

--xla_gpu_dump_autotune_results_to=
--xla_gpu_load_autotune_results_from=

যদি আমরা একটি .txt বা .textproto ফাইল নির্দিষ্ট করি, তাহলে ক্যাশে টেক্সটপ্রোটো ফরম্যাটে ডাম্প করা হবে, অন্যথায় বাইনারি প্রোটোবাফ ফরম্যাটে।

পরীক্ষায়

টেস্টের ক্ষেত্রেও পারসিস্টেড অটোটিউনিং ব্যবহার করা যেতে পারে। টেস্টের সংখ্যা খুব বেশি হলে, বিশেষ করে টেস্ট এনভায়রনমেন্টের পারফরম্যান্স সীমিত হলে, এটি ব্যবহার করার পরামর্শ দেওয়া হয়।

এটি কেবল তখনই ভালোভাবে কাজ করে, যখন অটোটিউন ক্যাশে সেইসব ফলাফল থাকে যা পরীক্ষাগুলো যে ধরনের জিপিইউ-তে চালানো হচ্ছে, ঠিক সেই একই ধরনের জিপিইউ-তে তৈরি হয়েছে।

একটি পরীক্ষা করার সময় অটোটিউনিং অব্যাহত ছিল

আপাতত ধরে নেওয়া যাক যে, আলোচ্য পরীক্ষাটি সবসময় একই ধরনের জিপিইউ ব্যবহার করে।

  1. আমাদেরকে টেস্ট থেকে অটোটিউনের ফলাফল এক্সপোর্ট করতে হবে, উদাহরণস্বরূপ টেস্ট কমান্ডে এই প্যারামিটারগুলো উল্লেখ করে:

    --test_env=XLA_FLAGS=--xla_gpu_dump_autotune_results_to=TEST_UNDECLARED_OUTPUTS_DIR/autotune_cache.textproto
    --test_sharding_strategy=disabled
    

    সমস্ত পরীক্ষার জন্য সঠিকভাবে একটি একক অটোটিউন ক্যাশে পেতে শার্ডিং নিষ্ক্রিয় করতে হবে।

  2. তারপর আমাদের সেই ক্যাশেটি আমাদের কোড রিপোজিটরিতে আপলোড করতে হবে।

  3. এরপর আমাদের টেস্ট টার্গেটের ডেটা ডিপেন্ডেন্সিতে ক্যাশেটি যোগ করতে হবে এবং একটি এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে তা লোড করতে হবে।

    data = ["test_autotune_cache.textproto"],
    env = {"XLA_FLAGS": "--xla_gpu_load_autotune_results_from=" +
                        "$(execpath test_autotune_cache.textproto)"},
    

    যেসব টেস্ট অটোটিউন ফলাফল লোড করে, সেগুলোতে শার্ডিং ব্যবহার করা যেতে পারে।

অনুগ্রহ করে xla/backends/gpu/tests/BUILD- এ থাকা উদাহরণ পরীক্ষাগুলোও দেখুন:

  • load_autotune_results_using_execpath_test
  • লোড_অটোটুন_ফলাফলস_ফ্রম_টেস্ট_ওয়ার্কস্পেস_টেস্ট
  • dump_autotune_results_to_test_outputs_test

ক্যাশে অপ্রচলিত

যদি কোনো মডেলে অনেক পরিবর্তন করা হয়, তাহলে এমন হতে পারে যে ক্যাশে আর সব ফিউশন থাকবে না, ফলে টেস্টটি ধীরগতির হয়ে যাবে। এই ক্ষেত্রে আমাদের অটোটিউনিং ক্যাশে পুনরায় তৈরি করতে হবে।

পরীক্ষাগুলো চালানোর জন্য আমরা যদি নতুন ধরনের জিপিইউ ব্যবহার করা শুরু করি, তাহলেও একই নিয়ম প্রযোজ্য হবে।

XLA কম্পাইলারের বিবর্তনের ফলে যদি এটি ভিন্ন ফিউশন তৈরি করে, তবে ক্যাশেটিও অপ্রচলিত হয়ে যেতে পারে।