ওভারভিউ
টেনসরের অনির্দিষ্ট শার্ডিং (বা টেনসরের নির্দিষ্ট মাত্রা) অনুমান করার জন্য শার্ডিং প্রচার ব্যবহারকারী-নির্দিষ্ট শার্ডিং ব্যবহার করে। এটি গণনা গ্রাফের ডেটা প্রবাহকে (ব্যবহার-ডিফ চেইন) উভয় দিকেই অতিক্রম করে যতক্ষণ না একটি নির্দিষ্ট বিন্দুতে পৌঁছায়, অর্থাৎ, পূর্ববর্তী শার্ডিং সিদ্ধান্তগুলি পূর্বাবস্থায় না নিয়ে শার্ডিং আর পরিবর্তন করতে পারে না।
বংশবৃদ্ধি ধাপে পচনশীল হতে পারে। প্রতিটি ধাপে একটি নির্দিষ্ট অপারেশনের দিকে তাকানো এবং সেই অপারেশনের বৈশিষ্ট্যের উপর ভিত্তি করে টেনসর (অপারেন্ড এবং ফলাফল) এর মধ্যে প্রচার করা জড়িত। একটি উদাহরণ হিসাবে একটি matmul নিলে, আমরা ফলাফলের সংশ্লিষ্ট মাত্রার সাথে lhs বা rhs-এর অ-কন্ট্রাক্টিং মাত্রার মধ্যে বা lhs এবং rhs-এর সংকোচনশীল মাত্রার মধ্যে প্রচার করব।
একটি অপারেশনের বৈশিষ্ট্যগুলি এর ইনপুট এবং আউটপুটগুলিতে সংশ্লিষ্ট মাত্রাগুলির মধ্যে সংযোগ নির্ধারণ করে এবং অপ শার্ডিং নিয়ম অনুসারে বিমূর্ত করা যেতে পারে।
বিরোধ নিষ্পত্তি ছাড়াই, বিবাদমান অক্ষগুলিকে উপেক্ষা করার সময় একটি প্রচার পদক্ষেপ কেবল যতটা সম্ভব প্রচার করবে; আমরা এটিকে (দীর্ঘতম) সামঞ্জস্যপূর্ণ প্রধান শার্ডিং অক্ষ হিসাবে উল্লেখ করি।
বিস্তারিত ডিজাইন
দ্বন্দ্ব সমাধানের অনুক্রম
আমরা একটি অনুক্রমের মধ্যে একাধিক দ্বন্দ্ব সমাধানের কৌশল রচনা করি:
- ব্যবহারকারী সংজ্ঞায়িত অগ্রাধিকার . শার্ডিং রিপ্রেজেন্টেশনে , আমরা বর্ণনা করেছি কিভাবে প্রোগ্রামের ক্রমবর্ধমান বিভাজন করার জন্য ডাইমেনশন শার্ডিংয়ের সাথে অগ্রাধিকার যুক্ত করা যেতে পারে, যেমন, ব্যাচ প্যারালেলিজম -> মেগাট্রন -> জিরো শার্ডিং করা। এটি পুনরাবৃত্তিতে প্রচার প্রয়োগ করে অর্জন করা হয় - পুনরাবৃত্তি
i
এ আমরা সমস্ত ডাইমেনশন শার্ডিংগুলি প্রচার করি যেগুলির অগ্রাধিকার<=i
এবং অন্য সকলকে উপেক্ষা করি৷ আমরা এটাও নিশ্চিত করি যে প্রচারটি ব্যবহারকারীর সংজ্ঞায়িত শার্ডিংগুলিকে নিম্ন অগ্রাধিকার (>i
) দিয়ে ওভাররাইড করবে না, এমনকি যদি সেগুলি পূর্ববর্তী পুনরাবৃত্তির সময় উপেক্ষা করা হয়। - অপারেশন ভিত্তিক অগ্রাধিকার । আমরা অপারেশন প্রকারের উপর ভিত্তি করে শার্ডিংগুলি প্রচার করি। "পাস-থ্রু" ক্রিয়াকলাপগুলির (যেমন, উপাদান-ভিত্তিক ক্রিয়াকলাপ এবং পুনর্নির্মাণ) সর্বোচ্চ অগ্রাধিকার রয়েছে, যখন আকৃতির রূপান্তর (যেমন, ডট এবং হ্রাস) সহ ক্রিয়াকলাপগুলির অগ্রাধিকার কম৷
- আক্রমণাত্মক প্রচার। একটি আক্রমনাত্মক কৌশল সঙ্গে shardings প্রচার করুন. মৌলিক কৌশল শুধুমাত্র দ্বন্দ্ব ছাড়াই শার্ডিং প্রচার করে, যখন আক্রমনাত্মক কৌশল দ্বন্দ্বের সমাধান করে। উচ্চ আক্রমনাত্মকতা সম্ভাব্য যোগাযোগ খরচ মেমরি পদচিহ্ন কমাতে পারে.
- মৌলিক প্রচার। এটি শ্রেণিবিন্যাসের মধ্যে প্রচারের সর্বনিম্ন কৌশল, যা কোনও বিরোধের সমাধান করে না এবং পরিবর্তে সমস্ত অপারেন্ড এবং ফলাফলের মধ্যে সামঞ্জস্যপূর্ণ অক্ষগুলিকে প্রচার করে।
এই অনুক্রমটিকে লুপগুলির জন্য নেস্টেড হিসাবে ব্যাখ্যা করা যেতে পারে। উদাহরণস্বরূপ, প্রতিটি ব্যবহারকারীর অগ্রাধিকারের জন্য, একটি সম্পূর্ণ অপ-অগ্রাধিকার প্রচার প্রয়োগ করা হয়।
অপারেশন শার্ডিং নিয়ম
শার্ডিং নিয়ম প্রতিটি অপারেশনের একটি বিমূর্ততা প্রবর্তন করে যা নির্দিষ্ট অপারেশনের ধরন এবং তাদের বৈশিষ্ট্যগুলি সম্পর্কে যুক্তি ছাড়াই অপারেন্ড থেকে ফলাফল বা অপারেন্ড জুড়ে শার্ডিংগুলি প্রচার করার জন্য প্রয়োজনীয় তথ্য সহ প্রকৃত প্রচার অ্যালগরিদম সরবরাহ করে। এটি মূলত অপ-নির্দিষ্ট যুক্তিকে ফ্যাক্টর করে এবং শুধুমাত্র প্রচারের উদ্দেশ্যে সমস্ত অপের জন্য একটি ভাগ করা প্রতিনিধিত্ব (ডেটা স্ট্রাকচার) প্রদান করে। এর সহজতম আকারে, এটি কেবল এই ফাংশনটি সরবরাহ করে:
GetOpShardingRule(Operation *) -> OpShardingRuleAttr
নিয়মটি আমাদের এই ডেটা স্ট্রাকচারের (OpShardingRule) উপর ভিত্তি করে শুধুমাত্র একবার প্রপাগেশন অ্যালগরিদম লিখতে দেয় যা অনেকগুলি অপ্স জুড়ে একই রকম কোডের প্রতিলিপি করার পরিবর্তে, অপস জুড়ে বাগ বা অসামঞ্জস্যপূর্ণ আচরণের সম্ভাবনাকে ব্যাপকভাবে হ্রাস করে।
মাতমুল উদাহরণে ফিরে যাওয়া যাক।
একটি এনকোডিং যা প্রচারের সময় প্রয়োজনীয় তথ্যগুলিকে এনক্যাপসুলেট করে, অর্থাৎ, মাত্রার মধ্যে সম্পর্ক, ইন্সাম নোটেশন আকারে লেখা যেতে পারে:
(i, k), (k, j) -> (i, j)
এই এনকোডিংয়ে, প্রতিটি মাত্রা একটি একক ফ্যাক্টরের সাথে ম্যাপ করা হয়।
কীভাবে প্রচার এই ম্যাপিংটি ব্যবহার করে: যদি একটি অক্ষের সাথে একটি অপারেন্ড/ফলাফলের একটি মাত্রা সংক্ষিপ্ত করা হয়, তবে প্রচার এই ম্যাপিংয়ে সেই মাত্রার ফ্যাক্টরটি সন্ধান করবে এবং একই ফ্যাক্টর সহ অন্যান্য অপারেন্ড/ফ্যাক্টরগুলিকে তাদের নিজ নিজ মাত্রার সাথে সংক্ষিপ্ত করবে - এবং (বিষয়) প্রতিলিপি সম্পর্কে পূর্ববর্তী আলোচনায়) সম্ভাব্যভাবে অন্যান্য অপারেন্ড/ফলাফলের প্রতিলিপি তৈরি করে যেগুলির অক্ষ বরাবর সেই ফ্যাক্টর নেই।
যৌগিক কারণ: পুনঃআকৃতির জন্য নিয়ম প্রসারিত করা
অনেক অপারেশনে, যেমন, মাটমুল, আমাদের শুধুমাত্র প্রতিটি মাত্রাকে একটি একক ফ্যাক্টরে ম্যাপ করতে হবে। যাইহোক, এটি পুনর্নির্মাণের জন্য যথেষ্ট নয়।
নিম্নলিখিত পুনঃআকৃতি একটিতে দুটি মাত্রাকে একত্রিত করে:
%out = mhlo.reshape(%in) : (tensor<2x4x32xf32>) -> tensor<8x32xf32>
এখানে ইনপুটের 0 এবং 1 উভয় মাত্রাই আউটপুটের 0 মাত্রার সাথে মিলে যায়। বলুন আমরা ইনপুটকে ফ্যাক্টর দিয়ে শুরু করি:
(i,j,k) : i=2, j=4, k=32
আপনি দেখতে পাচ্ছেন যে আমরা যদি আউটপুটের জন্য একই কারণগুলি ব্যবহার করতে চাই, তবে একাধিক কারণের উল্লেখ করার জন্য আমাদের একটি একক মাত্রার প্রয়োজন হবে:
(i,j,k) -> ((ij), k) : i=2, j=4, k=32
যদি পুনঃআকৃতি একটি মাত্রা বিভক্ত করা হয় তবে একই কাজ করা যেতে পারে:
%out = mhlo.reshape(%in) : (tensor<8x32xf32>) -> tensor<2x4x32xf32> ((ij), k) -> (i,j,k) : i=2, j=4, k=32
এখানে সাইজ 8 এর ডাইমেনশনটি মূলত 2 এবং 4 ফ্যাক্টর নিয়ে গঠিত, তাই আমরা ফ্যাক্টরগুলোকে (i,j,k) ফ্যাক্টর বলছি।
এই কারণগুলি এমন ক্ষেত্রেও কাজ করতে পারে যেখানে কোনও একটি কারণের সাথে সামঞ্জস্যপূর্ণ কোনও সম্পূর্ণ মাত্রা নেই:
%out = mhlo.reshape(%in) : (tensor<8x4xf32>) -> tensor<2x16xf32> ((ij), k) -> (i,(jk)) : i=2, j=4, k=4
এই উদাহরণটিও জোর দেয় যে কেন আমাদের ফ্যাক্টরের আকারগুলি সংরক্ষণ করতে হবে - যেহেতু আমরা সংশ্লিষ্ট মাত্রাগুলি থেকে সেগুলি সহজেই অনুমান করতে পারি না।
মূল প্রচার অ্যালগরিদম
ফ্যাক্টর বরাবর shardings প্রচার করুন
শার্ডিতে, আমাদের কাছে টেনসর, মাত্রা এবং কারণের অনুক্রম রয়েছে। তারা বিভিন্ন স্তরে ডেটা প্রতিনিধিত্ব করে। একটি গুণনীয়ক একটি উপ-মাত্রা। এটি একটি অভ্যন্তরীণ শ্রেণিবিন্যাস যা শার্ডিং প্রচারে ব্যবহৃত হয়। প্রতিটি মাত্রা এক বা একাধিক কারণের সাথে সঙ্গতিপূর্ণ হতে পারে। মাত্রা এবং ফ্যাক্টরের মধ্যে ম্যাপিং OpShardingRule দ্বারা সংজ্ঞায়িত করা হয়।
শার্ডি মাত্রার পরিবর্তে ফ্যাক্টর বরাবর শার্ডিং অক্ষগুলি প্রচার করে । এটি করার জন্য, নীচের চিত্রে দেখানো হিসাবে আমাদের তিনটি ধাপ রয়েছে
- প্রজেক্ট ডিমশার্ডিং থেকে ফ্যাক্টরশার্ডিং
- ফ্যাক্টরশার্ডিং এর স্পেসে শার্ডিং অক্ষগুলি প্রচার করুন
- আপডেট করা DimSharding পেতে আপডেট করা ফ্যাক্টরশার্ডিং প্রজেক্ট করুন
ফ্যাক্টর বরাবর Sharding প্রচারের ভিজ্যুয়ালাইজেশন
আমরা শার্ডিং প্রচারের সমস্যা এবং অ্যালগরিদম কল্পনা করতে নিম্নলিখিত টেবিলটি ব্যবহার করব।
F0 | F1 | F2 | স্পষ্টভাবে প্রতিলিপি করা অক্ষ | |
---|---|---|---|---|
T0 | ||||
T1 | ||||
T2 |
- প্রতিটি কলাম একটি ফ্যাক্টর প্রতিনিধিত্ব করে। F0 মানে সূচক 0 সহ ফ্যাক্টর। আমরা ফ্যাক্টর (কলাম) বরাবর শার্ডিং প্রচার করি।
- প্রতিটি সারি একটি টেনসর প্রতিনিধিত্ব করে। T0 সূচক 0 সহ টেনসরকে বোঝায়। টেনসর হল সমস্ত অপারেন্ড এবং একটি নির্দিষ্ট অপারেশনের জন্য জড়িত ফলাফল। এক সারিতে অক্ষগুলি ওভারল্যাপ করতে পারে না। একটি অক্ষ (বা উপ-অক্ষ) একটি টেনসরকে বহুবার বিভাজন করতে ব্যবহার করা যায় না। যদি একটি অক্ষ স্পষ্টভাবে প্রতিলিপি করা হয়, আমরা টেনসরকে বিভাজন করতে এটি ব্যবহার করতে পারি না।
সুতরাং, প্রতিটি কোষ একটি ফ্যাক্টর শার্ডিং প্রতিনিধিত্ব করে। আংশিক টেনসরে একটি ফ্যাক্টর অনুপস্থিত হতে পারে। C = dot(A, B)
এর জন্য টেবিলটি নীচে রয়েছে। একটি N
ধারণকারী কোষগুলি বোঝায় যে ফ্যাক্টরটি টেনসরে নেই। উদাহরণস্বরূপ, F2 T1 এবং T2 তে আছে, কিন্তু T0 তে নয়।
C = dot(A, B) | F0 ব্যাচিং আবছা | F1 নন-কন্ট্রাক্টিং ডিম | F2 নন-কন্ট্রাক্টিং ডিম | F3 কন্ট্রাক্টিং ডিম | স্পষ্টভাবে প্রতিলিপি করা অক্ষ |
---|---|---|---|---|---|
T0 = A | এন | ||||
T1 = B | এন | ||||
T2 = C | এন |
শার্ডিং অক্ষ সংগ্রহ এবং প্রচার করুন
আমরা বিস্তার কল্পনা করার জন্য নীচে দেখানো একটি সহজ উদাহরণ ব্যবহার করি।
F0 | F1 | F2 | স্পষ্টভাবে প্রতিলিপি করা অক্ষ | |
---|---|---|---|---|
T0 | "একটি" | "চ" | ||
T1 | "ক", "বি" | "গ", "ডি" | "g" | |
T2 | "গ", "ই" |
ধাপ 1. প্রতিটি ফ্যাক্টর (ওরফে (দীর্ঘতম) সামঞ্জস্যপূর্ণ প্রধান শার্ডিং অক্ষ) বরাবর প্রচার করার জন্য অক্ষগুলি খুঁজুন। এই উদাহরণের জন্য, আমরা F0 বরাবর ["a", "b"]
প্রচার করি, F1 বরাবর ["c"]
প্রচার করি এবং F2 বরাবর কিছুই প্রচার করি না।
ধাপ 2. নিম্নলিখিত ফলাফল পেতে ফ্যাক্টর শার্ডিংগুলি প্রসারিত করুন।
F0 | F1 | F2 | স্পষ্টভাবে প্রতিলিপি করা অক্ষ | |
---|---|---|---|---|
T0 | "ক", "বি" | "গ" | "চ" | |
T1 | "ক", "বি" | "গ", "ডি" | "g" | |
T2 | "ক", "বি" | "গ", "ই" |