סמנטיקה של פעולה

בקטע הבא מוסבר על הסמנטיקה של הפעולות שמוגדרות בממשק XlaBuilder. בדרך כלל, הפעולות האלה ממופות אחת לאחת לפעולות שמוגדרות בממשק ה-RPC ב-xla_data.proto.

הערה לגבי מינוח: סוג הנתונים הכללי XLA מתייחס למערך N-ממדי שמכיל רכיבים מסוג אחיד כלשהו (כמו float של 32 ביט). בכל המסמכים, מערך מציין מערך רב-ממדי שרירותי. לנוחותכם, למקרים מיוחדים יש שמות ספציפיים ומוכרים יותר. לדוגמה, וקטור הוא מערך חד-ממדי ומטריצה היא מערך דו-ממדי.

מידע נוסף על המבנה של Op זמין במאמרים צורות ופריסה ופריסה של משבצות.

Abs

מידע נוסף זמין במאמר בנושא XlaBuilder::Abs.

ערך מוחלט של כל רכיב x -> |x|.

Abs(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO - abs.

הוספה

מידע נוסף זמין במאמר בנושא XlaBuilder::Add.

מבצעת חיבור של lhs ו-rhs לפי רכיבים.

Add(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור רב-ממדי עבור Add:

Add(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר בנושא StableHLO – הוספה.

AddDependency

מידע נוסף זמין במאמר בנושא HloInstruction::AddDependency.

יכול להיות ש-AddDependency יופיעו בקובצי dump של HLO, אבל הם לא מיועדים לבנייה ידנית על ידי משתמשי קצה.

AfterAll

מידע נוסף זמין במאמר בנושא XlaBuilder::AfterAll.

הפונקציה AfterAll מקבלת מספר משתנה של טוקנים ומפיקה טוקן יחיד. אסימונים (tokens) הם סוגים פרימיטיביים שאפשר להעביר בין פעולות עם תופעות לוואי כדי לאכוף סדר. אפשר להשתמש ב-AfterAll כדי להגדיר פעולה מסוימת אחרי קבוצה של פעולות.

AfterAll(tokens)

ארגומנטים סוג סמנטיקה
tokens וקטור של XlaOp מספר משתנה של טוקנים

למידע על StableHLO, ראו StableHLO – after_all.

AllGather

מידע נוסף זמין במאמר בנושא XlaBuilder::AllGather.

מבצע שרשור בין רפליקות.

AllGather(operand, all_gather_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך לאיחוד בין עותקים
all_gather_dimension int64 מאפיין שרשור
shard_count int64 הגודל של כל קבוצת רפליקות
replica_groups וקטור של וקטורים של int64 קבוצות שביניהן מתבצעת השרשור
channel_id אופציונלי ChannelHandle מזהה ערוץ אופציונלי לתקשורת בין מודולים
layout אופציונלי Layout יוצר תבנית פריסה שתתעד את הפריסה התואמת בארגומנט
use_global_device_ids אופציונלי bool הפונקציה מחזירה true אם המזהים בהגדרות של ReplicaGroup מייצגים מזהה גלובלי
  • replica_groups היא רשימה של קבוצות רפליקות שביניהן מתבצעת השרשור (אפשר לאחזר את מזהה הרפליקה של הרפליקה הנוכחית באמצעות ReplicaId). הסדר של הרפליקות בכל קבוצה קובע את הסדר שבו הקלט שלהן מופיע בתוצאה. replica_groups השדה הזה צריך להיות ריק (ואז כל העותקים שייכים לקבוצה אחת, מסודרים מ-0 עד N - 1), או להכיל את אותו מספר רכיבים כמו מספר העותקים. לדוגמה, הפונקציה replica_groups = {0, 2}, {1, 3} מבצעת שרשור בין העותקים 0 ו-2, ובין 1 ו-3.
  • shard_count הוא הגודל של כל קבוצת עותקים. אנחנו צריכים את זה במקרים שבהם השדות replica_groups ריקים.
  • הסימן channel_id משמש לתקשורת בין מודולים: רק פעולות עם אותו channel_id יכולות לתקשר זו עם זו.all-gather
  • use_global_device_ids הפונקציה מחזירה true אם המזהים בהגדרות של ReplicaGroup מייצגים מזהה גלובלי של (replica_id * partition_count + partition_id) במקום מזהה רפליקה. כך אפשר לקבץ מכשירים בצורה גמישה יותר אם הפעולה all-reduce היא גם חוצת מחיצות וגם חוצת עותקים.

צורת הפלט היא צורת הקלט עם all_gather_dimension שהוגדלה פי shard_count. לדוגמה, אם יש שני עותקים והאופרנד הוא [1.0, 2.5] ו-[3.0, 5.25] בהתאמה בשני העותקים, ערך הפלט מהפעולה הזו שבה all_gather_dim הוא 0 יהיה [1.0, 2.5, 3.0,5.25] בשני העותקים.

ממשק ה-API של AllGather מפורק באופן פנימי ל-2 הוראות HLO ‏(AllGatherStart ו-AllGatherDone).

מידע נוסף זמין במאמר בנושא HloInstruction::CreateAllGatherStart.

AllGatherStart ו-AllGatherDone משמשים כפרימיטיבים ב-HLO. יכול להיות שהפעולות האלה יופיעו בקובצי dump של HLO, אבל הן לא מיועדות ליצירה ידנית על ידי משתמשי קצה.

מידע על StableHLO זמין במאמר StableHLO - all_gather.

AllReduce

מידע נוסף זמין במאמר בנושא XlaBuilder::AllReduce.

מבצעת חישוב בהתאמה אישית בין העותקים.

AllReduce(operand, computation, replica_groups, channel_id, shape_with_layout, use_global_device_ids)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך או טופל לא ריק של מערכים לצמצום בין העותקים
computation XlaComputation חישוב הצמצום
replica_groups ReplicaGroup וקטור קבוצות שביניהן מתבצעות ההפחתות
channel_id אופציונלי ChannelHandle מזהה ערוץ אופציונלי לתקשורת בין מודולים
shape_with_layout אופציונלי Shape הגדרת הפריסה של הנתונים המועברים
use_global_device_ids אופציונלי bool הפונקציה מחזירה true אם המזהים בהגדרות של ReplicaGroup מייצגים מזהה גלובלי
  • אם operand הוא טאפל של מערכים, הפעולה all-reduce מתבצעת על כל רכיב בטאפל.
  • replica_groups היא רשימה של קבוצות העתקים שביניהן מתבצעת ההפחתה (אפשר לאחזר את מזהה ההעתק של ההעתק הנוכחי באמצעות ReplicaId). הרשימה replica_groups חייבת להיות ריקה (במקרה כזה כל ההעתקים שייכים לקבוצה אחת), או להכיל את אותו מספר של רכיבים כמו מספר ההעתקים. לדוגמה, replica_groups = {0, 2}, {1, 3} מבצע צמצום בין העותקים 0 ו-2, ובין 1 ו-3.
  • הסימן channel_id משמש לתקשורת בין מודולים: רק פעולות עם אותו channel_id יכולות לתקשר זו עם זו.all-reduce
  • shape_with_layout: כופה את הפריסה של AllReduce לפריסה שצוינה. הפרמטר הזה משמש כדי להבטיח את אותו פריסה לקבוצה של פעולות AllReduce שעברו קומפילציה בנפרד.
  • use_global_device_ids הפונקציה מחזירה true אם המזהים בהגדרות של ReplicaGroup מייצגים מזהה גלובלי של (replica_id * partition_count + partition_id) במקום מזהה רפליקה. כך אפשר לקבץ מכשירים בצורה גמישה יותר אם הפעולה all-reduce היא גם חוצת מחיצות וגם חוצת עותקים.

צורת הפלט זהה לצורת הקלט. לדוגמה, אם יש שני עותקים והאופרנד הוא [1.0, 2.5] ו-[3.0, 5.25] בהתאמה בשני העותקים, ערך הפלט מהאופרציה הזו וחישוב הסכום יהיה [4.0, 7.75] בשני העותקים. אם הקלט הוא טאפל, הפלט יהיה גם הוא טאפל.

כדי לחשב את התוצאה של AllReduce, צריך לקבל קלט מכל עותק משוכפל. לכן, אם עותק משוכפל אחד מבצע צומת AllReduce יותר פעמים מעותק אחר, העותק הראשון ימתין לנצח. מכיוון שכל העותקים הרפליקציות מריצים את אותה תוכנית, אין הרבה דרכים שזה יכול לקרות, אבל זה אפשרי אם התנאי של לולאת while תלוי בנתונים מ-infeed והנתונים מ-infeed גורמים ללולאת while לבצע יותר איטרציות בעותק רפליקציה אחד מאשר בעותק רפליקציה אחר.

ממשק ה-API של AllReduce מפורק באופן פנימי ל-2 הוראות HLO ‏(AllReduceStart ו-AllReduceDone).

מידע נוסף זמין במאמר בנושא HloInstruction::CreateAllReduceStart.

AllReduceStart ו-AllReduceDone משמשים כפרימיטיבים ב-HLO. יכול להיות שהפעולות האלה יופיעו בקובצי dump של HLO, אבל הן לא מיועדות ליצירה ידנית על ידי משתמשי קצה.

CrossReplicaSum

מידע נוסף זמין במאמר בנושא XlaBuilder::CrossReplicaSum.

מבצעת AllReduce עם חישוב סכום.

CrossReplicaSum(operand, replica_groups)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך או טופל לא ריק של מערכים לצמצום בין העותקים
replica_groups וקטור של וקטורים של int64 קבוצות שביניהן מתבצעות ההפחתות

הפונקציה מחזירה את סכום ערכי האופרנד בכל תת-קבוצה של העתקים. כל העותקים מספקים קלט אחד לסכום, וכל העותקים מקבלים את הסכום שמתקבל לכל קבוצת משנה.

AllToAll

מידע נוסף זמין במאמר בנושא XlaBuilder::AllToAll.

‫AllToAll היא פעולה קולקטיבית ששולחת נתונים מכל הליבות לכל הליבות. התהליך כולל שני שלבים:

  1. שלב הפיזור. בכל ליבה, האופרנד מפולג ל-split_count מספר בלוקים לאורך split_dimensions, והבלוקים מפוזרים לכל הליבות, לדוגמה, הבלוק ה-i נשלח לליבה ה-i.
  2. שלב האיסוף. כל ליבה משרשרת את הבלוקים שהתקבלו לאורך concat_dimension.

אפשר להגדיר את הליבות המשתתפות באמצעות:

  • replica_groups: כל ReplicaGroup מכיל רשימה של מזהי רפליקות שמשתתפות בחישוב (אפשר לאחזר את מזהה הרפליקה הנוכחית באמצעות ReplicaId). הפעולה AllToAll תתבצע בתוך קבוצות משנה בסדר שצוין. לדוגמה, replica_groups = { {1,2,3}, {4,5,0} } פירושו ש-AllToAll יוחל בתוך העותקים המשוכפלים {1, 2, 3}, ובשלב האיסוף, והבלוקים שהתקבלו יורכבו באותו סדר של 1, 2, 3. לאחר מכן, יוחל עוד AllToAll בעותקים 4, 5, 0, וסדר השרשור יהיה גם 4, 5, 0. אם replica_groups ריק, כל העותקים שייכים לקבוצה אחת, לפי סדר השרשור של המופעים שלהם.

דרישות מוקדמות:

  • הגודל של מימד האופרנד ב-split_dimension מתחלק ב-split_count.
  • הצורה של האופרנד היא לא טאפל.

AllToAll(operand, split_dimension, concat_dimension, split_count, replica_groups, layout, channel_id)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך קלט n ממדי
split_dimension int64 ערך במרווח [0,n) שמציין את המאפיין שלפיו האופרנד מפולח
concat_dimension int64 ערך במרווח [0,n) שבו מצוין שם המימד שלאורכו הבלוקים המפוצלים מחוברים
split_count int64 מספר ליבות המעבד שמשתתפות בפעולה הזו. אם השדה replica_groups ריק, צריך להזין כאן את מספר העותקים. אחרת, צריך להזין כאן מספר ששווה למספר העותקים בכל קבוצה.
replica_groups ReplicaGroupוקטור כל קבוצה מכילה רשימה של מזהי העתקים.
layout אופציונלי Layout פריסת זיכרון בהגדרת המשתמש
channel_id אופציונלי ChannelHandle מזהה ייחודי לכל זוג של שליחה/קבלה

מידע נוסף על צורות ופריסות זמין במאמר xla::shapes.

למידע על StableHLO, ראו StableHLO - all_to_all.

‫AllToAll – דוגמה 1.

XlaBuilder b("alltoall");
auto x = Parameter(&b, 0, ShapeUtil::MakeShape(F32, {4, 16}), "x");
AllToAll(
    x,
    /*split_dimension=*/ 1,
    /*concat_dimension=*/ 0,
    /*split_count=*/ 4);

בדוגמה שלמעלה, יש 4 ליבות שמשתתפות ב-Alltoall. בכל ליבה, האופרנד מחולק ל-4 חלקים לאורך מימד 1, כך שלכל חלק יש צורה f32[4,4]. ארבעת החלקים מפוזרים בין כל הליבות. לאחר מכן, כל ליבה משרשרת את החלקים שהתקבלו לאורך מאפיין 0, לפי הסדר של ליבה 0 עד 4. לכן, הפלט בכל ליבה הוא בצורה f32[16,4].

AllToAll - Example 2 - StableHLO

דוגמה לזרימת נתונים מסוג AllToAll עבור StableHLO

בדוגמה שלמעלה, יש 2 רפליקות שמשתתפות ב-AllToAll. בכל רפליקה, לאופרנד יש צורה f32[2,4]. האופרנד מפוצל לשני חלקים לאורך מימד 1, כך שלכל חלק יש צורה f32[2,2]. לאחר מכן, שני החלקים מוחלפים בין העותקים בהתאם למיקום שלהם בקבוצת העותקים. כל רפליקה אוספת את החלק המתאים שלה משני האופרנדים ומשרשרת אותם לאורך מימד 0. כתוצאה מכך, הפלט בכל עותק זהה בצורה f32[4,2].

RaggedAllToAll

מידע נוסף זמין במאמר בנושא XlaBuilder::RaggedAllToAll.

‫RaggedAllToAll מבצע פעולה קולקטיבית של all-to-all, שבה הקלט והפלט הם טנסורים משוננים.

RaggedAllToAll(input, input_offsets, send_sizes, output, output_offsets, recv_sizes, replica_groups, channel_id)

ארגומנטים סוג סמנטיקה
input XlaOp מערך N מסוג T
input_offsets XlaOp מערך N מסוג T
send_sizes XlaOp מערך N מסוג T
output XlaOp מערך N מסוג T
output_offsets XlaOp מערך N מסוג T
recv_sizes XlaOp מערך N מסוג T
replica_groups ReplicaGroup וקטור כל קבוצה מכילה רשימה של מזהי עותקים.
channel_id אופציונלי ChannelHandle מזהה ייחודי לכל זוג של שליחה/קבלה

טנסורים לא סדירים מוגדרים על ידי קבוצה של שלושה טנסורים:

  • data: טנסור data הוא 'משונן' לאורך הממד החיצוני ביותר שלו, שבו לכל רכיב באינדקס יש גודל משתנה.
  • offsets': הטנזור offsets מבצע אינדוקס של הממד החיצוני ביותר של הטנזור data, ומייצג את ההיסטארט של כל רכיב לא סדיר של הטנזור data.
  • sizes: טנסור sizes מייצג את הגודל של כל רכיב לא סדיר בטנסור data, כאשר הגודל מצוין ביחידות של רכיבי משנה. רכיב משנה מוגדר כסיומת של צורת טנסור הנתונים שמתקבלת מהסרת המימד החיצוני ביותר של הנתונים.
  • הטנסורים offsets ו-sizes צריכים להיות באותו גודל.

דוגמה לטנזור לא אחיד:

data: [8,3] =
{ {a,b,c},{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r},{s,t,u},{v,w,x} }

offsets: [3] = {0, 1, 4}

sizes: [3] = {1, 3, 4}

// Index 'data' at 'offsets'[0], 'sizes'[0]' // {a,b,c}

// Index 'data' at 'offsets'[1], 'sizes'[1]' // {d,e,f},{g,h,i},{j,k,l}

// Index 'data' at 'offsets'[2], 'sizes'[2]' // {m,n,o},{p,q,r},{s,t,u},{v,w,x}

צריך לפצל את output_offsets כך שלכל העתק יהיו היסטים מנקודת המבט של פלט העתק היעד.

עבור היסט הפלט ה-i, העותק הנוכחי ישלח עדכון input[input_offsets[i]:input_offsets[i]+input_sizes[i]] לעותק ה-i שייכתב ל-output_i[output_offsets[i]:output_offsets[i]+send_sizes[i]] בעותק ה-i output.

לדוגמה, אם יש לנו 2 רפליקות:

replica 0:
input: [1, 2, 2]
output:[0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 2]
output_offsets: [0, 0]
recv_sizes: [1, 1]

replica 1:
input: [3, 4, 0]
output: [0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 1]
output_offsets: [1, 2]
recv_sizes: [2, 1]

// replica 0's result will be: [1, 3, 0, 0]
// replica 1's result will be: [2, 2, 4, 0]

ה-HLO המדורג all-to-all כולל את הארגומנטים הבאים:

  • input: טנסור של נתוני קלט לא אחידים.
  • output: טנזור של נתוני פלט לא אחידים.
  • input_offsets: טנזור של היסטים של קלט לא אחיד.
  • send_sizes: טנזור של גדלים לא אחידים של שליחות.
  • output_offsets: מערך של היסטים לא סדירים בפלט של העותק המשוכפל של היעד.
  • recv_sizes: טנזור של גדלים לא אחידים של recv.

לכל הטנסורים *_offsets ו-*_sizes צריך להיות אותו צורה.

יש תמיכה בשתי צורות של טנסורים *_offsets ו-*_sizes:

  • [num_devices] שבו יכול להיות שיישלח עדכון אחד לכל מכשיר מרוחק בקבוצת העותקים. לדוגמה:
for (remote_device_id : replica_group) {
     SEND input[input_offsets[remote_device_id]],
     output[output_offsets[remote_device_id]],
     send_sizes[remote_device_id] }
  • [num_devices, num_updates] שבהם ragged-all-to-all עשוי לשלוח עד num_updates עדכונים לאותו מכשיר מרוחק (כל אחד בהיסט שונה), לכל מכשיר מרוחק בקבוצת העותקים.

לדוגמה:

for (remote_device_id : replica_group) {
    for (update_idx : num_updates) {
        SEND input[input_offsets[remote_device_id][update_idx]],
        output[output_offsets[remote_device_id][update_idx]]],
        send_sizes[remote_device_id][update_idx] } }

וגם

מידע נוסף זמין במאמר בנושא XlaBuilder::And.

מבצעת פעולת AND בין שני טנסורים, lhs ו-rhs, ברמת הרכיב.

And(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבה רב-ממדית שונה עבור And:

And(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

למידע על StableHLO, ראו StableHLO - and.

אסינכרוני

ראו גם HloInstruction::CreateAsyncStart, HloInstruction::CreateAsyncUpdate, HloInstruction::CreateAsyncDone.

AsyncDone, ‏ AsyncStart ו-AsyncUpdate הן הוראות פנימיות של HLO שמשמשות לפעולות אסינכרוניות, והן פרימיטיבים ב-HLO. יכול להיות שהפעולות האלה יופיעו בפריקות של HLO, אבל הן לא מיועדות לבנייה ידנית על ידי משתמשי קצה.

Atan2

מידע נוסף זמין במאמר בנושא XlaBuilder::Atan2.

מבצע פעולת atan2 לפי רכיבים ב-lhs וב-rhs.

Atan2(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור מממד שונה עבור Atan2:

Atan2(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – atan2.

BatchNormGrad

תיאור מפורט של האלגוריתם מופיע גם במאמרים XlaBuilder::BatchNormGrad והמקורי בנושא נורמליזציה של קבוצות.

מחשבת את הגרדיאנטים של נורמליזציית אצווה.

BatchNormGrad(operand, scale, batch_mean, batch_var, grad_output, epsilon, feature_index)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך n מימדי שיש לנרמל (x)
scale XlaOp מערך חד-ממדי (\(\gamma\))
batch_mean XlaOp מערך חד-ממדי (\(\mu\))
batch_var XlaOp מערך חד-ממדי (\(\sigma^2\))
grad_output XlaOp מעברי צבע שהועברו אל BatchNormTraining (\(\nabla y\))
epsilon float ערך Epsilon ‏ (\(\epsilon\))
feature_index int64 אינדקס להצגת מאפיין ב-operand

לכל מאפיין במאפיין התכונה (feature_index הוא האינדקס של מאפיין התכונה ב-operand), הפעולה מחשבת את הגרדיאנטים ביחס ל-operand, ל-offset ול-scale בכל שאר המאפיינים. הערך של feature_index חייב להיות אינדקס תקין של מאפיין התכונה ב-operand.

שלושת הגרדיאנטים מוגדרים באמצעות הנוסחאות הבאות (בהנחה שמערך 4 ממדי כ-operand, עם אינדקס ממד התכונה l, גודל אצווה m וגדלים מרחביים w ו-h):

\[ \begin{split} c_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sigma^2_l+\epsilon} \right) \\\\ d_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \\\\ \nabla x_{ijkl} &= \frac{\gamma_{l} }{\sqrt{\sigma^2_{l}+\epsilon} } \left( \nabla y_{ijkl} - d_l - c_l (x_{ijkl} - \mu_{l}) \right) \\\\ \nabla \gamma_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sqrt{\sigma^2_{l}+\epsilon} } \right) \\\\\ \nabla \beta_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \end{split} \]

הקלט batch_mean והקלט batch_var מייצגים ערכי רגעים במאפיינים של קבוצות ומרחבים.

סוג הפלט הוא טאפל של שלושה אובייקטים מסוג handle:

פלט סוג סמנטיקה
grad_operand XlaOp השיפוע ביחס לקלט operand (\(\nabla x\))
grad_scale XlaOp הגרדיאנט ביחס לקלט **scale ** (\(\nabla\gamma\))
grad_offset XlaOp gradient with respect to input offset(\(\nabla\beta\))

מידע על StableHLO זמין במאמר StableHLO – batch_norm_grad.

BatchNormInference

תיאור מפורט של האלגוריתם מופיע גם במאמרים XlaBuilder::BatchNormInference והמקורי בנושא נורמליזציה של קבוצות.

מנרמלת מערך על פני מאפייני מיקום ומאפיינים של קבוצות.

BatchNormInference(operand, scale, offset, mean, variance, epsilon, feature_index)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך n מימדי שצריך לנרמל
scale XlaOp מערך חד-ממדי
offset XlaOp מערך חד-ממדי
mean XlaOp מערך חד-ממדי
variance XlaOp מערך חד-ממדי
epsilon float ערך אפסילון
feature_index int64 אינדקס להצגת מאפיין ב-operand

לכל מאפיין במאפיין feature (feature_index הוא האינדקס של המאפיין feature ב-operand), הפעולה מחשבת את הממוצע והשונות בכל שאר המאפיינים, ומשתמשת בממוצע ובשונות כדי לנרמל כל רכיב ב-operand. הערך של feature_index צריך להיות אינדקס חוקי למאפיין המאפיינים של התכונה ב-operand.

הפונקציה BatchNormInference שקולה לקריאה לפונקציה BatchNormTraining בלי לחשב את mean ואת variance לכל קבוצה. הוא משתמש בקלט mean ובקלט variance במקום זאת כערכים משוערים. מטרת הפעולה הזו היא להפחית את זמן האחזור בהסקת מסקנות, ומכאן השם BatchNormInference.

הפלט הוא מערך מנורמל n-ממדי עם צורה זהה לזו של הקלט operand.

מידע על StableHLO זמין במאמר StableHLO – batch_norm_inference.

BatchNormTraining

תיאור מפורט של האלגוריתם מופיע גם במאמרים XlaBuilder::BatchNormTraining וthe original batch normalization paper.

מנרמלת מערך על פני מימדים של אצווה ומימדים מרחביים.

BatchNormTraining(operand, scale, offset, epsilon, feature_index)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך n מימדי שיש לנרמל (x)
scale XlaOp מערך חד-ממדי (\(\gamma\))
offset XlaOp מערך חד-ממדי (\(\beta\))
epsilon float ערך אפסילון (\(\epsilon\))
feature_index int64 אינדקס להצגת מאפיין ב-operand

לכל מאפיין במאפיין feature (feature_index הוא האינדקס של המאפיין feature ב-operand), הפעולה מחשבת את הממוצע והשונות בכל שאר המאפיינים, ומשתמשת בממוצע ובשונות כדי לנרמל כל רכיב ב-operand. הערך של feature_index צריך להיות אינדקס חוקי למאפיין המאפיינים של התכונה ב-operand.

האלגוריתם פועל באופן הבא לכל אצווה ב-operand \(x\) שמכילה m רכיבים עם w ו-h כגודל הממדים המרחביים (בהנחה ש-operand הוא מערך 4 ממדי):

  • מחשבת את הממוצע של קבוצת הפריטים \(\mu_l\) לכל תכונה l בממד התכונה: \(\mu_l=\frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h x_{ijkl}\)

  • חישוב השונות של קבוצת תמונות \(\sigma^2_l\): $\sigma^2l=\frac{1}{mwh}\sum{i=1}^m\sum{j=1}^w\sum{k=1}^h (x_{ijkl} - \mu_l)^2$

  • נרמול, שינוי קנה מידה והזזה: \(y_{ijkl}=\frac{\gamma_l(x_{ijkl}-\mu_l)}{\sqrt[2]{\sigma^2_l+\epsilon} }+\beta_l\)

ערך האפסילון, בדרך כלל מספר קטן, מתווסף כדי למנוע שגיאות חלוקה באפס.

סוג הפלט הוא טאפל של שלושה ערכים מסוג XlaOp:

פלט סוג סמנטיקה
output XlaOp מערך n ממדי עם אותה צורה כמו הקלט operand (y)
batch_mean XlaOp מערך חד-ממדי (\(\mu\))
batch_var XlaOp מערך חד-ממדי (\(\sigma^2\))

הערכים batch_mean ו-batch_var הם רגעים שמחושבים על פני קבוצת הפריטים והמאפיינים המרחביים באמצעות הנוסחאות שלמעלה.

מידע על StableHLO זמין במאמר StableHLO - batch_norm_training.

Bitcast

מידע נוסף זמין במאמר בנושא HloInstruction::CreateBitcast.

Bitcast עשוי להופיע בקובצי dump של HLO, אבל הוא לא מיועד לבנייה ידנית על ידי משתמשי קצה.

BitcastConvertType

מידע נוסף זמין במאמר בנושא XlaBuilder::BitcastConvertType.

בדומה ל-tf.bitcast ב-TensorFlow, הפעולה מבצעת bitcast ברמת הרכיב מצורת נתונים לצורת יעד. הגודל של הקלט והפלט חייב להיות זהה: למשל, s32 רכיבים הופכים ל-f32 רכיבים באמצעות שגרת bitcast, ורכיב אחד של s32 יהפוך לארבעה רכיבים של s8. ‫Bitcast מיושם כהעברה ברמה נמוכה, ולכן מכונות עם ייצוגים שונים של נקודות צפות יניבו תוצאות שונות.

BitcastConvertType(operand, new_element_type)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T עם מימדים D
new_element_type PrimitiveType type U

המידות של האופרנד ושל צורת היעד צריכות להיות זהות, למעט המימד האחרון שישתנה בהתאם ליחס בין גודל הפרימיטיב לפני ההמרה ואחריה.

סוגי הרכיבים של המקור והיעד לא יכולים להיות טופלים.

מידע על StableHLO זמין במאמר StableHLO - bitcast_convert.

Bitcast-converting to primitive type of different width

BitcastConvert ההוראה HLO תומכת במקרה שבו הגודל של סוג רכיב הפלט T' לא שווה לגודל של רכיב הקלט T. מכיוון שהפעולה כולה היא שידור ביט (bitcast) ולא משנה את הבייטים הבסיסיים, הצורה של רכיב הפלט צריכה להשתנות. עבור B = sizeof(T), B' = sizeof(T'), יש שני מקרים אפשריים.

קודם כל, כש-B > B', צורת הפלט מקבלת מימד חדש קטן ביותר בגודל B/B'. לדוגמה:

  f16[10,2]{1,0} %output = f16[10,2]{1,0} bitcast-convert(f32[10]{0} %input)

הכלל נשאר זהה עבור סקלרים אפקטיביים:

  f16[2]{0} %output = f16[2]{0} bitcast-convert(f32[] %input)

לחלופין, עבור B' > B ההוראה מחייבת שהמאפיין הלוגי האחרון של צורת הקלט יהיה שווה ל-B'/B, והמאפיין הזה מושמט במהלך ההמרה:

  f32[10]{0} %output = f32[10]{0} bitcast-convert(f16[10,2]{1,0} %input)

שימו לב שהמרות בין רוחבי סיביות שונים לא מתבצעות ברמת הרכיב.

להודיע לכולם

מידע נוסף זמין במאמר בנושא XlaBuilder::Broadcast.

הפונקציה מוסיפה מאפיינים למערך על ידי שכפול הנתונים במערך.

Broadcast(operand, broadcast_sizes)

ארגומנטים סוג סמנטיקה
operand XlaOp המערך לשכפול
broadcast_sizes ArraySlice<int64> הגודל של המאפיינים החדשים

המימדים החדשים מוכנסים בצד ימין, כלומר אם ל-broadcast_sizes יש ערכים {a0, ..., aN} ולצורה של האופרנד יש מימדים {b0, ..., bM}, אז לצורה של הפלט יש מימדים {a0, ..., aN, b0, ..., bM}.

המאפיינים החדשים הם אינדקסים של עותקים של האופרנד, כלומר

output[i0, ..., iN, j0, ..., jM] = operand[j0, ..., jM]

לדוגמה, אם operand הוא סקלר f32 עם הערך 2.0f, ו-broadcast_sizes הוא {2, 3}, התוצאה תהיה מערך עם הצורה f32[2, 3] וכל הערכים בתוצאה יהיו 2.0f.

מידע על StableHLO זמין במאמר StableHLO – שידור.

BroadcastInDim

מידע נוסף זמין במאמר בנושא XlaBuilder::BroadcastInDim.

מרחיבה את הגודל ואת מספר המאפיינים של מערך על ידי שכפול הנתונים במערך.

BroadcastInDim(operand, out_dim_size, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
operand XlaOp המערך לשכפול
out_dim_size ArraySlice<int64> הגדלים של המידות של צורת היעד
broadcast_dimensions ArraySlice<int64> איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

בדומה ל-Broadcast, אבל מאפשרת להוסיף מאפיינים בכל מקום ולהרחיב מאפיינים קיימים עם גודל 1.

הערך operand משודר לצורה שמתוארת על ידי out_dim_size. ‫broadcast_dimensions ממפה את המימדים של operand למימדים של צורת היעד, כלומר המימד ה-i של האופרנד ממופה למימד ה-broadcast_dimension[i] של צורת הפלט. הממדים של operand צריכים להיות בגודל 1 או באותו גודל כמו הממד בצורת הפלט שהם ממופים אליו. שאר המאפיינים יאוכלסו במאפיינים בגודל 1. לאחר מכן, מתבצע שידור (broadcast) של המימד המנוון לאורך המימדים המנוונים האלה כדי להגיע לצורת הפלט. הסמנטיקה מתוארת בפירוט בדף השידור.

התקשרות

מידע נוסף זמין במאמר בנושא XlaBuilder::Call.

מפעילה חישוב עם הארגומנטים הנתונים.

Call(computation, operands...)

ארגומנטים סוג סמנטיקה
computation XlaComputation חישוב מסוג T_0, T_1, ..., T_{N-1} -> S עם N פרמטרים מסוג שרירותי
operands רצף של N XlaOps ‫N ארגומנטים מסוג שרירותי

הארות והסוגים של operands צריכים להתאים לפרמטרים של computation. מותר לא לכלול את operands.

CompositeCall

מידע נוסף זמין במאמר בנושא XlaBuilder::CompositeCall.

מכיל פעולה שמורכבת מפעולות אחרות של StableHLO, מקבלת קלט ו-composite_attributes ומפיקה תוצאות. הסמנטיקה של הפעולה מיושמת על ידי מאפיין הפירוק. אפשר להחליף את הפעולה המורכבת בפירוק שלה בלי לשנות את הסמנטיקה של התוכנית. במקרים שבהם הטמעה של הפירוק לא מספקת את אותה סמנטיקת פעולה, עדיף להשתמש ב-custom_call.

השדה version (ברירת המחדל היא 0) משמש לציון מתי הסמנטיקה של רכיב מורכב משתנה.

הפעולה הזו מיושמת כ-kCall עם המאפיין is_composite=true. השדה decomposition מוגדר על ידי המאפיין computation. מאפייני חזית האתר מאחסנים את שאר המאפיינים עם הקידומת composite..

דוגמה לפעולת CompositeCall:

f32[] call(f32[] %cst), to_apply=%computation, is_composite=true,
frontend_attributes = {
  composite.name="foo.bar",
  composite.attributes={n = 1 : i32, tensor = dense<1> : tensor<i32>},
  composite.version="1"
}

CompositeCall(computation, operands..., name, attributes, version)

ארגומנטים סוג סמנטיקה
computation XlaComputation חישוב מסוג T_0, T_1, ..., T_{N-1} -> S עם N פרמטרים מסוג שרירותי
operands רצף של N XlaOps מספר ערכים משתנה
name string שם המורכב
attributes אופציונלי string מילון אופציונלי של מאפיינים בפורמט מחרוזת
version אופציונלי int64 מספר לעדכוני גרסה לסמנטיקה של הפעולה המורכבת

ה-decomposition של פעולה הוא לא שדה שנקרא, אלא מופיע כמאפיין to_apply שמפנה לפונקציה שמכילה את ההטמעה ברמה הנמוכה יותר, כלומר to_apply=%funcname

מידע נוסף על קומפוזיציה ופירוק זמין במפרט של StableHLO.

Cbrt

מידע נוסף זמין במאמר בנושא XlaBuilder::Cbrt.

פעולת שורש שלישי לפי רכיבים x -> cbrt(x).

Cbrt(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Cbrt תומכת גם בארגומנט האופציונלי result_accuracy:

Cbrt(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – cbrt.

תקרה

מידע נוסף זמין במאמר בנושא XlaBuilder::Ceil.

פונקציית התקרה (ceil) לפי רכיבים x -> ⌈x⌉.

Ceil(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO - ceil.

Cholesky

מידע נוסף זמין במאמר בנושא XlaBuilder::Cholesky.

מחשבת את פירוק צ'ולסקי של קבוצת מטריצות סימטריות (הרמיטיות) חיוביות מוגדרות.

Cholesky(a, lower)

ארגומנטים סוג סמנטיקה
a XlaOp מערך מסוג מרוכב או מסוג נקודה צפה עם יותר מ-2 מימדים.
lower bool אם להשתמש במשולש העליון או התחתון של a.

אם lower הוא true, הפונקציה מחשבת מטריצות משולשות תחתונות l כך ש-$a = l . ‫l^T$. אם lower הוא false, המערכת מחשבת מטריצות משולשות עליונות u כך שמתקיים\(a = u^T . u\).

נתוני הקלט נקראים רק מהמשולש התחתון או העליון של a, בהתאם לערך של lower. המערכת מתעלמת מהערכים מהמשולש השני. נתוני הפלט מוחזרים באותו המשולש. הערכים במשולש השני מוגדרים בהטמעה ויכולים להיות כל דבר.

אם ל-a יש יותר מ-2 מאפיינים, המערכת מתייחסת ל-a כאל קבוצה של מטריצות, שבה כל המאפיינים חוץ מ-2 המאפיינים המשניים הם מאפייני קבוצה.

אם a לא סימטרי (הרמיטי) וחיובי מוגדר, התוצאה תלויה בהטמעה.

מידע על StableHLO זמין במאמר StableHLO – cholesky.

תיחום

מידע נוסף זמין במאמר בנושא XlaBuilder::Clamp.

הפונקציה מגבילה את האופרנד לטווח שבין ערך מינימלי לערך מקסימלי.

Clamp(min, operand, max)

ארגומנטים סוג סמנטיקה
min XlaOp מערך מסוג T
operand XlaOp מערך מסוג T
max XlaOp מערך מסוג T

בהינתן אופרנד וערכים מינימליים ומקסימליים, הפונקציה מחזירה את האופרנד אם הוא נמצא בטווח שבין הערך המינימלי לערך המקסימלי. אחרת, היא מחזירה את הערך המינימלי אם האופרנד נמוך מהטווח הזה, או את הערך המקסימלי אם האופרנד גבוה מהטווח הזה. כלומר, clamp(a, x, b) = min(max(a, x), b).

לכל שלושת המערכים צריך להיות אותו צורה. לחלופין, כצורה מוגבלת של שידור, ‏min ו/או max יכולים להיות סקלר מסוג T.

דוגמה עם סקלר min ו-max:

let operand: s32[3] = {-1, 5, 9};
let min: s32 = 0;
let max: s32 = 6;
==>
Clamp(min, operand, max) = s32[3]{0, 5, 6};

מידע על StableHLO זמין במאמר StableHLO - clamp.

כיווץ

מידע נוסף זמין במאמר בנושא XlaBuilder::Collapse. והפעולה tf.reshape.

מצמצמת את המימדים של מערך למימד אחד.

Collapse(operand, dimensions)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T
dimensions int64 וקטור קבוצת משנה רציפה של המאפיינים של T, לפי הסדר.

הפונקציה Collapse מחליפה את קבוצת המשנה הנתונה של מימדי האופרנד במימד יחיד. ארגומנטי הקלט הם מערך שרירותי מסוג T ווקטור של אינדקסים של ממדים שהוא קבוע בזמן הקומפילציה. האינדקסים של המימדים חייבים להיות קבוצת משנה רציפה של המימדים של T, בסדר עולה (מספר המימד הנמוך לגבוה). לכן, {0, 1, 2},‏ {0, 1} או {1, 2} הם כולם קבוצות מימדים תקינות, אבל {1, 0} או {0, 2} לא תקינות. הם מוחלפים במאפיין חדש יחיד, באותו מיקום ברצף המאפיינים כמו המאפיינים שהם מחליפים, והגודל של המאפיין החדש שווה למכפלה של הגדלים של המאפיינים המקוריים. מספר המאפיין הנמוך ביותר ב-dimensions הוא המאפיין עם השינוי הכי איטי (הכי משמעותי) בקינון הלולאות שדוחס את המאפיינים האלה, ומספר המאפיין הכי גבוה הוא המאפיין עם השינוי הכי מהיר (הכי זניח). אם נדרש סדר כללי יותר של צמצום, אפשר לעיין באופרטור tf.reshape.

לדוגמה, נניח ש-v הוא מערך של 24 רכיבים:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
{ {20, 21, 22}, {25, 26, 27} },
{ {30, 31, 32}, {35, 36, 37} },
{ {40, 41, 42}, {45, 46, 47} } };

// Collapse to a single dimension, leaving one dimension.
let v012 = Collapse(v, {0,1,2});
then v012 == f32[24] {10, 11, 12, 15, 16, 17,
20, 21, 22, 25, 26, 27,
30, 31, 32, 35, 36, 37,
40, 41, 42, 45, 46, 47};

// Collapse the two lower dimensions, leaving two dimensions.
let v01 = Collapse(v, {0,1});
then v01 == f32[4x6] { {10, 11, 12, 15, 16, 17},
{20, 21, 22, 25, 26, 27},
{30, 31, 32, 35, 36, 37},
{40, 41, 42, 45, 46, 47} };

// Collapse the two higher dimensions, leaving two dimensions.
let v12 = Collapse(v, {1,2});
then v12 == f32[8x3] { {10, 11, 12},
{15, 16, 17},
{20, 21, 22},
{25, 26, 27},
{30, 31, 32},
{35, 36, 37},
{40, 41, 42},
{45, 46, 47} };

Clz

מידע נוסף זמין במאמר בנושא XlaBuilder::Clz.

ספירת אפסים מובילים בכל רכיב.

Clz(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

CollectiveBroadcast

מידע נוסף זמין במאמר בנושא XlaBuilder::CollectiveBroadcast.

משדר נתונים בין העותקים. הנתונים נשלחים ממזהה העותק הראשון בכל קבוצה למזהים האחרים באותה קבוצה. אם מזהה של רפליקה לא נמצא באף קבוצת רפליקות, הפלט ברפליקה הזו הוא טנסור שמורכב מאפסים ב-shape.

CollectiveBroadcast(operand, replica_groups, channel_id)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
replica_groups ReplicaGroupוקטור כל קבוצה מכילה רשימה של מזהי עותקים
channel_id אופציונלי ChannelHandle מזהה ייחודי לכל זוג של שליחה/קבלה

מידע על StableHLO זמין במאמר StableHLO - collective_broadcast.

CollectivePermute

מידע נוסף זמין במאמר בנושא XlaBuilder::CollectivePermute.

‫CollectivePermute היא פעולה קולקטיבית ששולחת ומקבלת נתונים בין רפליקות.

CollectivePermute(operand, source_target_pairs, channel_id, inplace)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך קלט n ממדי
source_target_pairs <int64, int64> וקטור רשימה של זוגות (source_replica_id, target_replica_id). בכל זוג, האופרנד נשלח מהרפליקה של המקור לרפליקה של היעד.
channel_id אופציונלי ChannelHandle מזהה ערוץ אופציונלי לתקשורת בין מודולים
inplace אופציונלי bool סימון שמציין אם צריך לבצע את התמורה במקום

שימו לב להגבלות הבאות על source_target_pairs:

  • לשני זוגות שונים לא יכול להיות אותו מזהה של העותק המשוכפל של היעד, ולא יכול להיות להם אותו מזהה של העותק המשוכפל של המקור.
  • אם מזהה רפליקה לא מוגדר כיעד באף זוג, הפלט ברפליקה הזו הוא טנסור שמורכב מאפסים עם אותה צורה כמו הקלט.

ה-API של פעולת CollectivePermute מפורק באופן פנימי ל-2 הוראות HLO‏ (CollectivePermuteStart ו-CollectivePermuteDone).

מידע נוסף זמין במאמר בנושא HloInstruction::CreateCollectivePermuteStart.

CollectivePermuteStart ו-CollectivePermuteDone משמשים כפרימיטיבים ב-HLO. יכול להיות שהפעולות האלה יופיעו בקובצי dump של HLO, אבל הן לא מיועדות לבנייה ידנית על ידי משתמשי קצה.

למידע על StableHLO, ראו StableHLO - collective_permute.

השוואה

מידע נוסף זמין במאמר בנושא XlaBuilder::Compare.

הפונקציה מבצעת השוואה בין lhs לבין rhs של הרכיבים הבאים:

Eq

מידע נוסף זמין במאמר בנושא XlaBuilder::Eq.

הפונקציה מבצעת השוואה שווה ל- בין lhs לבין rhs ברמת הרכיב.

\(lhs = rhs\)

Eq(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור לממדים שונים עבור משוואה:

Eq(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

קיימת תמיכה בסכום הזמנה כולל מעל המספרים הנקודתיים עבור Eq, על ידי אכיפה של:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

EqTotalOrder(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

מידע על StableHLO זמין במאמר StableHLO – השוואה.

Ne

מידע נוסף זמין במאמר בנושא XlaBuilder::Ne.

הפונקציה מבצעת השוואה של שונות בין lhs לבין rhs ברמת הרכיב.

\(lhs != rhs\)

Ne(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור ממדים שונים עבור Ne:

Ne(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

קיימת תמיכה בסכום הזמנה כולל מעל המספרים הנקודתיים ב-Ne, על ידי אכיפה של:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

NeTotalOrder(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

מידע על StableHLO זמין במאמר StableHLO – השוואה.

Ge

מידע נוסף זמין במאמר בנושא XlaBuilder::Ge.

הפונקציה מבצעת השוואה greater-or-equal-than בין lhs ל-rhs ברמת הרכיב.

\(lhs >= rhs\)

Ge(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור לממדים שונים עבור Ge:

Ge(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

קיימת תמיכה בסכום הזמנה כולל מעל המספרים העשרוניים ב-Gt, על ידי אכיפה של:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

GtTotalOrder(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

מידע על StableHLO זמין במאמר StableHLO – השוואה.

Gt

מידע נוסף זמין במאמר בנושא XlaBuilder::Gt.

מבצע השוואה של lhs ו-rhs לפי גדול מ- ברמת הרכיב.

\(lhs > rhs\)

Gt(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור לממדים שונים עבור Gt:

Gt(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – השוואה.

Le

מידע נוסף זמין במאמר בנושא XlaBuilder::Le.

הפונקציה מבצעת השוואה less-or-equal-than בין כל רכיב של lhs לכל רכיב של rhs.

\(lhs <= rhs\)

Le(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור בממדים שונים עבור Le:

Le(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

קיימת תמיכה בסכום הזמנה כולל מעל המספרים הנקודתיים הצפים עבור Le, על ידי אכיפה של:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LeTotalOrder(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

מידע על StableHLO זמין במאמר StableHLO – השוואה.

Lt

מידע נוסף זמין במאמר בנושא XlaBuilder::Lt.

הפונקציה מבצעת השוואה של קטן מ- בין כל רכיב ב-lhs לבין הרכיב התואם ב-rhs.

\(lhs < rhs\)

Lt(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור רב-ממדי שונה עבור Lt:

Lt(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

קיימת תמיכה בסכום הזמנה כולל מעל המספרים הנקודתיים עבור Lt, על ידי אכיפה של:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LtTotalOrder(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

מידע על StableHLO זמין במאמר StableHLO – השוואה.

רמה למתקדמים מאוד

מידע נוסף זמין במאמר בנושא XlaBuilder::Complex.

מבצעת המרה של כל רכיב בנפרד לערך מרוכב מתוך זוג ערכים ממשיים ומדומים, lhs ו-rhs.

Complex(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור לממדים שונים עבור Complex:

Complex(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – complex.

ConcatInDim (שרשור)

מידע נוסף זמין במאמר בנושא XlaBuilder::ConcatInDim.

הפונקציה Concatenate יוצרת מערך מכמה אופרנדים של מערכים. למערך יש אותו מספר ממדים כמו לכל אחד מהאופרנדים של מערך הקלט (שחייבים להיות בעלי אותו מספר ממדים), והוא מכיל את הארגומנטים בסדר שבו הם צוינו.

Concatenate(operands..., dimension)

ארגומנטים סוג סמנטיקה
operands רצף של N XlaOp ‫N מערכים מסוג T עם מימדים [L0, L1, ...]. נדרש N >= 1.
dimension int64 ערך במרווח [0, N) שמציין את שם המאפיין שיוצמד בין operands.

כל המימדים חייבים להיות זהים, למעט dimension. הסיבה לכך היא ש-XLA לא תומך במערכים לא סדירים. חשוב גם לזכור שאי אפשר לשרשר ערכים של מאפיינים עם 0 ממדים (כי אי אפשר לתת שם לממד שבו מתבצע השרשור).

דוגמה חד-ממדית:

Concat({ {2, 3}, {4, 5}, {6, 7} }, 0)
//Output:  {2, 3, 4, 5, 6, 7}

דוגמה דו-ממדית:

let a = { {1, 2},
         {3, 4},
         {5, 6} };

let b = { {7, 8} };

Concat({a, b}, 0)

//Output:  { {1, 2},
//          {3, 4},
//          {5, 6},
//          {7, 8} }

תרשים:

מידע על StableHLO זמין במאמר StableHLO – concatenate.

משפטי תנאי

מידע נוסף זמין במאמר בנושא XlaBuilder::Conditional.

Conditional(predicate, true_operand, true_computation, false_operand, false_computation)

ארגומנטים סוג סמנטיקה
predicate XlaOp סקלר מסוג PRED
true_operand XlaOp ארגומנט מסוג \(T_0\)
true_computation XlaComputation ‫XlaComputation of type \(T_0 \to S\)
false_operand XlaOp ארגומנט מסוג \(T_1\)
false_computation XlaComputation ‫XlaComputation of type \(T_1 \to S\)

מבצעת את true_computation אם predicate הוא true, מבצעת את false_computation אם predicate הוא false ומחזירה את התוצאה.

הפונקציה true_computation חייבת לקבל ארגומנט יחיד מהסוג \(T_0\) , והיא תופעל עם true_operand, שחייב להיות מאותו סוג. הפונקציה false_computation צריכה לקבל ארגומנט יחיד מהסוג \(T_1\) והיא תופעל עם false_operand שחייב להיות מאותו סוג. הסוג של הערך המוחזר של true_computation ושל false_computation חייב להיות זהה.

שימו לב שרק אחת מהפעולות true_computation ו-false_computation תתבצע, בהתאם לערך של predicate.

Conditional(branch_index, branch_computations, branch_operands)

ארגומנטים סוג סמנטיקה
branch_index XlaOp סקלר מסוג S32
branch_computations רצף של N XlaComputation ‫XlaComputations of type \(T_0 \to S , T_1 \to S , ..., T_{N-1} \to S\)
branch_operands רצף של N XlaOp ארגומנטים מסוג \(T_0 , T_1 , ..., T_{N-1}\)

מבצעת את הפעולה branch_computations[branch_index] ומחזירה את התוצאה. אם branch_index הוא S32 שקטן מ-0 או גדול מ-N או שווה לו, אז הפעולה branch_computations[N-1] מתבצעת כענף ברירת המחדל.

כל branch_computations[b] צריך לקבל ארגומנט יחיד מסוג \(T_b\) , והוא יופעל עם branch_operands[b] שצריך להיות מאותו סוג. הסוג של הערך המוחזר של כל branch_computations[b] חייב להיות זהה.

שימו לב שרק אחת מהפעולות branch_computations תבוצע, בהתאם לערך של branch_index.

מידע על StableHLO זמין במאמר בנושא StableHLO – if.

קבוע

מידע נוסף זמין במאמר בנושא XlaBuilder::ConstantLiteral.

הפונקציה מחזירה output מקבוע literal.

Constant(literal)

ארגומנטים סוג סמנטיקה
literal LiteralSlice תצוגה קבועה של Literal

מידע על StableHLO זמין במאמר StableHLO – קבוע.

ConvertElementType

מידע נוסף זמין במאמר בנושא XlaBuilder::ConvertElementType.

בדומה ל-static_cast ב-C++, ‏ ConvertElementType מבצעת פעולת המרה לפי רכיבים מצורת נתונים לצורת יעד. המימדים צריכים להיות זהים, וההמרה היא המרה של כל רכיב בנפרד. לדוגמה, s32 רכיבים הופכים ל-f32 רכיבים באמצעות שגרת המרה מ-s32 ל-f32.

ConvertElementType(operand, new_element_type)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T עם מימדים D
new_element_type PrimitiveType type U

המימדים של האופרנד ושל צורת היעד צריכים להיות זהים. סוגי הרכיבים של המקור והיעד לא יכולים להיות טופלים.

המרות כמו T=s32 ל-U=f32 יבצעו שגרת המרה של מספר שלם למספר עשרוני עם נורמליזציה, כמו עיגול למספר הזוגי הקרוב ביותר.

let a: s32[3] = {0, 1, 2};
let b: f32[3] = convert(a, f32);
then b == f32[3]{0.0, 1.0, 2.0}

מידע על StableHLO זמין במאמר StableHLO – convert.

Conv (Convolution)

מידע נוסף זמין במאמר בנושא XlaBuilder::Conv.

מחשב קונבולוציה מהסוג שמשמש ברשתות נוירונים. אפשר לחשוב על קונבולוציה כחלון n-ממדי שנע על פני אזור בסיס n-ממדי, ומתבצע חישוב לכל מיקום אפשרי של החלון.

Conv Enqueues a convolution instruction onto the computation, which uses the default convolution dimension numbers with no dilation.

הריפוד מצוין בקיצור כ-SAME או כ-VALID. הריפוד מסוג SAME מרפד את הקלט (lhs) באפסים כך שהפלט יהיה באותה צורה כמו הקלט, בלי להתחשב בצעדים. ריווח תקין פשוט אומר שאין ריווח.

Conv(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך קלט ב-‎(n+2)‎ ממדים
rhs XlaOp מערך במימד (n+2) של משקלי ליבה
window_strides ArraySlice<int64> מערך n-d של צעדי ליבה
padding Padding טיפוסים בני מנייה (enum) של ריווח
feature_group_count int64 מספר קבוצות התכונות
batch_group_count int64 מספר קבוצות הבאצ'ים
precision_config אופציונלי PrecisionConfig enum for level of precision
preferred_element_type אופציונלי PrimitiveType enum של סוג רכיב סקלרי

אמצעי בקרה ברמות שונות זמינים ל-Conv:

נסמן ב-n את מספר הממדים המרחביים. הארגומנט lhs הוא מערך (n+2)-ממדי שמתאר את שטח הבסיס. החלק הזה נקרא קלט, אבל כמובן שגם הצד השמאלי הוא קלט. ברשת נוירונים, אלה הפעלות הקלט. המאפיינים n+2 הם, בסדר הזה:

  • batch: כל קואורדינטה בממד הזה מייצגת קלט עצמאי שעליו מתבצעת קונבולוציה.
  • z/depth/features: לכל מיקום (y,x) באזור הבסיס יש וקטור שמשויך אליו, והוא נכנס למאפיין הזה.
  • spatial_dims: מתאר את המידות המרחביות של n שמגדירות את אזור הבסיס שהחלון נע לאורכו.

הארגומנט rhs הוא מערך (n+2)-ממדי שמתאר את המסנן/הליבה/החלון של הקונבולוציה. אלה המאפיינים, בסדר הזה:

  • output-z: המאפיין z של הפלט.
  • input-z: הגודל של המאפיין הזה כפול feature_group_count צריך להיות שווה לגודל של המאפיין z בצד ימין.
  • spatial_dims: מתאר את n המאפיינים המרחביים שמגדירים את חלון ה-n-d שנע על פני אזור הבסיס.

הארגומנט window_strides מציין את הצעד של חלון הקונבולוציה בממדים המרחביים. לדוגמה, אם הצעד במאפיין המרחבי הראשון הוא 3, אפשר למקם את החלון רק בקואורדינטות שבהן האינדקס המרחבי הראשון מתחלק ב-3.

הארגומנט padding מציין את מספר האפסים שיוספו לשטח הבסיס. הערך של הריפוד יכול להיות שלילי – הערך המוחלט של ריפוד שלילי מציין את מספר האלמנטים שיש להסיר מהממד שצוין לפני שמבצעים את הקונבולוציה. ‫padding[0] מציין את הריווח של מאפיין y ו-padding[1] מציין את הריווח של מאפיין x. בכל זוג, הריווח התחתון הוא הרכיב הראשון והריווח העליון הוא הרכיב השני. המרווח הפנימי הנמוך מוחל בכיוון של אינדקסים נמוכים יותר, והמרווח הפנימי הגבוה מוחל בכיוון של אינדקסים גבוהים יותר. לדוגמה, אם padding[1] הוא (2,3), אז יהיה ריפוד של 2 אפסים בצד שמאל ושל 3 אפסים בצד ימין בממד המרחבי השני. שימוש בריפוד שווה להוספת אותם ערכי אפס לקלט (lhs) לפני ביצוע הקונבולוציה.

הארגומנטים lhs_dilation ו-rhs_dilation מציינים את גורם ההרחבה שיש להחיל על lhs ו-rhs, בהתאמה, בכל ממד מרחבי. אם גורם ההרחבה בממד מרחבי הוא d, אז d-1 חורים מוצבים באופן מרומז בין כל אחת מהרשומות בממד הזה, וכך גודל המערך גדל. החורים האלה מתמלאים בערך no-op, שבמקרה של קונבולוציה הוא אפסים.

הרחבה של הצד הימני נקראת גם קונבולוציה אטרוסית. פרטים נוספים זמינים במאמר tf.nn.atrous_conv2d. הרחבה של הצד השמאלי נקראת גם קונבולוציה משוחפת. פרטים נוספים זמינים במאמר tf.nn.conv2d_transpose.

אפשר להשתמש בארגומנט feature_group_count (ערך ברירת המחדל הוא 1) עבור קונבולוציות מקובצות. ‫feature_group_count צריך להיות מחלק של מימד התכונה של הקלט ושל הפלט. אם feature_group_count גדול מ-1, המשמעות היא שבאופן מושגי, המימד של תכונת הקלט והפלט והמימד של תכונת הפלט מחולקים באופן שווה לכמה קבוצות של feature_group_count, וכל קבוצה מורכבת מרצף עוקב של תכונות.rhs התכונה של קלט המימד rhs צריכה להיות שווה למימד של תכונת הקלט lhs חלקי feature_group_count (כך שהיא כבר כוללת את הגודל של קבוצת תכונות קלט). הקבוצות ה-i משמשות יחד לחישוב feature_group_count עבור הרבה קונבולוציות נפרדות. התוצאות של הקונבולוציות האלה משורשרות יחד בממד התכונה של הפלט.

במקרה של קונבולוציה עומקית, הארגומנט feature_group_count יוגדר למאפיין המימד של נתוני הקלט, והמסנן ישנה את הצורה מ-[filter_height, filter_width, in_channels, channel_multiplier] ל-[filter_height, filter_width, 1, in_channels * channel_multiplier]. פרטים נוספים זמינים במאמר tf.nn.depthwise_conv2d.

אפשר להשתמש בארגומנט batch_group_count (ערך ברירת המחדל הוא 1) כדי לסנן קבוצות במהלך הפצת שגיאות לאחור. ‫batch_group_count צריך להיות מחלק של גודל הממד של אצווה lhs (קלט). אם batch_group_count גדול מ-1, המשמעות היא שגודל המנה של הפלט צריך להיות input batch / batch_group_count. הערך batch_group_count חייב להיות מחלק של גודל תכונת הפלט.

הפלט הוא טנזור עם המימדים הבאים, בסדר הזה:

  • batch: הגודל של המאפיין הזה כפול batch_group_count צריך להיות שווה לגודל של המאפיין batch בצד ימין.
  • z: אותו גודל כמו output-z בקרנל (rhs).
  • spatial_dims: ערך אחד לכל מיקום חוקי של חלון הקונבולוציה.

באיור שלמעלה אפשר לראות איך השדה batch_group_count פועל. למעשה, אנחנו מחלקים כל קבוצה של lhs ל-batch_group_count קבוצות, ועושים את אותו הדבר לגבי תכונות הפלט. לאחר מכן, לכל אחת מהקבוצות האלה אנחנו מבצעים קונבולוציות בזוגות ומשרשרים את הפלט לאורך הממד של תכונת הפלט. הסמנטיקה התפעולית של כל המאפיינים האחרים (מאפיינים מרחביים ומאפיינים של תכונות) נשארת ללא שינוי.

המיקומים התקינים של חלון הקונבולוציה נקבעים על ידי הצעדים וגודל אזור הבסיס אחרי הריפוד.

כדי לתאר מה עושה קונבולוציה, נתייחס לקונבולוציה דו-ממדית ונבחר כמה קואורדינטות קבועות batch,‏ z,‏ y,‏ x בפלט. אז (y,x) הוא מיקום של פינת החלון בתוך אזור הבסיס (למשל, הפינה הימנית העליונה, בהתאם לאופן שבו מפרשים את המימדים המרחביים). עכשיו יש לנו חלון דו-ממדי, שנלקח מהאזור הבסיסי, שבו כל נקודה דו-ממדית משויכת לווקטור חד-ממדי, כך שמתקבלת תיבה תלת-ממדית. מליבת הקונבולוציה, מכיוון שתיקנו את קואורדינטת הפלט z, יש לנו גם תיבה תלת-ממדית. לשתי התיבות יש את אותם ממדים, ולכן אפשר לחשב את סכום המכפלות של הרכיבים בין שתי התיבות (בדומה למכפלה סקלרית). זה ערך הפלט.

הערה: אם הערך של output-z הוא למשל ‫5, אז כל מיקום של החלון יפיק 5 ערכים בפלט למאפיין z של הפלט. הערכים האלה שונים זה מזה בחלק של ליבת הקונבולוציה שמשמשת – יש תיבה תלת-ממדית נפרדת של ערכים שמשמשת לכל קואורדינטה של output-z. אפשר לחשוב על זה כעל 5 קונבולוציות נפרדות עם פילטר שונה לכל אחת מהן.

הנה פסאודו קוד עבור קונבולוציה דו-ממדית עם ריפוד ודילוג:

for (b, oz, oy, ox) { // output coordinates
  value = 0;
  for (iz, ky, kx) { // kernel coordinates and input z
    iy = oy*stride_y + ky - pad_low_y;
    ix = ox*stride_x + kx - pad_low_x;
    if ((iy, ix) inside the base area considered without padding) {
      value += input(b, iz, iy, ix) * kernel(oz, iz, ky, kx);
    }
  }
  output(b, oz, oy, ox) = value;
}

הפרמטר precision_config משמש לציון הגדרת הדיוק. הרמה קובעת אם החומרה צריכה לנסות ליצור עוד הוראות של קוד מכונה כדי לספק הדמיה מדויקת יותר של dtype כשצריך (כלומר, הדמיה של f32 ב-TPU שתומך רק ב-bf16 matmuls). הערכים יכולים להיות DEFAULT, ‏ HIGH, ‏ HIGHEST. פרטים נוספים בקטעים של MXU.

preferred_element_type הוא אלמנט סקלרי של סוגי פלט ברמת דיוק גבוהה או נמוכה יותר שמשמשים לצבירה. preferred_element_type ממליץ על סוג הצבירה לפעולה הנתונה, אבל אין בכך ערובה. כך אפשר לצבור נתונים בחלק מהעורפים של החומרה בסוג אחר ולהמיר אותם לסוג הפלט המועדף.

מידע על StableHLO זמין במאמר StableHLO – convolution.

ConvWithGeneralPadding

מידע נוסף זמין במאמר בנושא XlaBuilder::ConvWithGeneralPadding.

ConvWithGeneralPadding(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

זהה ל-Conv כאשר הגדרת הריפוד מפורשת.

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך קלט ב-‎(n+2)‎ ממדים
rhs XlaOp מערך במימד (n+2) של משקלי ליבה
window_strides ArraySlice<int64> מערך n-d של צעדי ליבה
padding ArraySlice< pair<int64,int64>> מערך n-d של (low, high) padding
feature_group_count int64 מספר קבוצות התכונות
batch_group_count int64 מספר קבוצות הבאצ'ים
precision_config אופציונלי PrecisionConfig enum for level of precision
preferred_element_type אופציונלי PrimitiveType enum של סוג רכיב סקלרי

ConvWithGeneralDimensions

מידע נוסף זמין במאמר בנושא XlaBuilder::ConvWithGeneralDimensions.

ConvWithGeneralDimensions(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

זהה ל-Conv, שבו מספרי המאפיינים מפורשים.

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך קלט עם (n+2) ממדים
rhs XlaOp מערך של משקלי ליבה עם n+2 ממדים
window_strides ArraySlice<int64> מערך n-ממדי של צעדי ליבה
padding Padding טיפוסים בני מנייה (enum) של ריווח
dimension_numbers ConvolutionDimensionNumbers מספר המאפיינים
feature_group_count int64 מספר קבוצות התכונות
batch_group_count int64 מספר קבוצות הבאצ'ים
precision_config אופציונלי PrecisionConfig טיפוס בן מנייה (enum) לרמת הדיוק
preferred_element_type אופציונלי PrimitiveType enum of scalar element type

ConvGeneral

מידע נוסף זמין במאמר בנושא XlaBuilder::ConvGeneral.

ConvGeneral(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

אותו דבר כמו Conv, שבו מספרי המאפיינים והגדרת הריפוד מוגדרים באופן מפורש

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך קלט עם (n+2) ממדים
rhs XlaOp מערך של משקלי ליבה עם n+2 ממדים
window_strides ArraySlice<int64> מערך n-ממדי של צעדי ליבה
padding ArraySlice< pair<int64,int64>> מערך n-d של (low, high) padding
dimension_numbers ConvolutionDimensionNumbers מספר המאפיינים
feature_group_count int64 מספר קבוצות התכונות
batch_group_count int64 מספר קבוצות הבאצ'ים
precision_config אופציונלי PrecisionConfig טיפוס בן מנייה (enum) לרמת הדיוק
preferred_element_type אופציונלי PrimitiveType enum of scalar element type

ConvGeneralDilated

מידע נוסף זמין במאמר בנושא XlaBuilder::ConvGeneralDilated.

ConvGeneralDilated(lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type, window_reversal)

זהה ל-Conv, שבו הגדרת הריפוד, גורמי ההרחבה ומספרי המאפיינים מפורטים.

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך קלט עם (n+2) ממדים
rhs XlaOp מערך של משקלי ליבה עם n+2 ממדים
window_strides ArraySlice<int64> מערך n-ממדי של צעדי ליבה
padding ArraySlice< pair<int64,int64>> מערך n-d של (low, high) padding
lhs_dilation ArraySlice<int64> מערך גורמי הרחבה של צד ימין ב-n ממדים
rhs_dilation ArraySlice<int64> n-d rhs dilation factor array
dimension_numbers ConvolutionDimensionNumbers מספר המאפיינים
feature_group_count int64 מספר קבוצות התכונות
batch_group_count int64 מספר קבוצות הבאצ'ים
precision_config אופציונלי PrecisionConfig טיפוס בן מנייה (enum) לרמת הדיוק
preferred_element_type אופציונלי PrimitiveType enum of scalar element type
window_reversal אופציונלי vector<bool> הדגל שמשמש להיפוך לוגי של המימד לפני שמחילים את הקונבולוציה

העתקה

מידע נוסף זמין במאמר בנושא HloInstruction::CreateCopyStart.

הפונקציה Copy מפורקת באופן פנימי ל-2 הוראות HLO‏: CopyStart ו-CopyDone. ‫Copy, יחד עם CopyStart ו-CopyDone, משמשים כפרימיטיבים ב-HLO. יכול להיות שהפעולות האלה יופיעו בקובצי dump של HLO, אבל הן לא מיועדות לבנייה ידנית על ידי משתמשי קצה.

Cos

ראו גםXlaBuilder::Cos.

קוסינוס לפי רכיבים x -> cos(x).

Cos(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Cos תומכת גם בארגומנט האופציונלי result_accuracy:

Cos(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – cosine.

Cosh

מידע נוסף זמין במאמר בנושא XlaBuilder::Cosh.

קוסינוס היפרבולי של כל רכיב x -> cosh(x).

Cosh(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

‫Cosh תומך גם בארגומנט האופציונלי result_accuracy:

Cosh(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

CustomCall

מידע נוסף זמין במאמר בנושא XlaBuilder::CustomCall.

להתקשר לפונקציה שסופקה על ידי המשתמש בתוך חישוב.

מסמכי התיעוד של CustomCall מופיעים במאמר פרטים למפתחים – קריאות מותאמות אישית של XLA

מידע על StableHLO זמין במאמר StableHLO – custom_call.

מח'

מידע נוסף זמין במאמר בנושא XlaBuilder::Div.

מבצעת חלוקה של המחולק lhs במחלק rhs לפי רכיבים.

Div(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

גלישה בחילוק של מספר שלם (חילוק/שארית של מספר חיובי/שלילי באפס או חילוק/שארית של INT_SMIN ב--1) מפיקה ערך שמוגדר על ידי ההטמעה.

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור בממדים שונים עבור רכיב Div:

Div(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר בנושא StableHLO – divide.

דומיין

מידע נוסף זמין במאמר בנושא HloInstruction::CreateDomain.

Domain עשוי להופיע בקובצי dump של HLO, אבל הוא לא מיועד לבנייה ידנית על ידי משתמשי קצה.

נקודה

מידע נוסף זמין במאמר בנושא XlaBuilder::Dot.

Dot(lhs, rhs, precision_config, preferred_element_type)

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך מסוג T
rhs XlaOp מערך מסוג T
precision_config אופציונלי PrecisionConfig enum for level of precision
preferred_element_type אופציונלי PrimitiveType enum של סוג רכיב סקלרי

הסמנטיקה המדויקת של הפעולה הזו תלויה בדרגות של האופרנדים:

קלט פלט סמנטיקה
וקטור [שם עצם] dot וקטור [שם עצם] סקלרי מכפלה סקלרית של וקטורים
מטריצה [m x k] dot וקטור [k] וקטור [m] הכפלה של מטריצה בווקטור
‫matrix [m x k] dot matrix [k x n] מטריצה [m x n] מטריצה-מטריצה כפל

הפעולה מבצעת סכום של מכפלות בממד השני של lhs (או בממד הראשון אם יש לו ממד אחד) ובממד הראשון של rhs. אלה המאפיינים 'שמופיעים בחוזה'. המידות המצומצמות של lhs ו-rhs צריכות להיות באותו גודל. בפועל, אפשר להשתמש בה כדי לבצע מכפלה סקלרית בין וקטורים, מכפלות של וקטורים ומטריצות או מכפלות של מטריצות.

הפרמטר precision_config משמש לציון הגדרת הדיוק. הרמה קובעת אם החומרה צריכה לנסות ליצור עוד הוראות של קוד מכונה כדי לספק הדמיה מדויקת יותר של dtype כשצריך (כלומר, הדמיה של f32 ב-TPU שתומך רק ב-bf16 matmuls). הערכים יכולים להיות DEFAULT, ‏ HIGH, ‏ HIGHEST. פרטים נוספים בקטעים של MXU.

preferred_element_type הוא אלמנט סקלרי של סוגי פלט ברמת דיוק גבוהה או נמוכה יותר שמשמשים לצבירה. preferred_element_type ממליץ על סוג הצבירה לפעולה הנתונה, אבל אין בכך ערובה. כך אפשר לצבור נתונים בחלק מהעורפים של החומרה בסוג אחר ולהמיר אותם לסוג הפלט המועדף.

מידע על StableHLO זמין במאמר בנושא StableHLO - dot.

DotGeneral

מידע נוסף זמין במאמר בנושא XlaBuilder::DotGeneral.

DotGeneral(lhs, rhs, dimension_numbers, precision_config, preferred_element_type)

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך מסוג T
rhs XlaOp מערך מסוג T
dimension_numbers DotDimensionNumbers מספרי מימדים של חוזים ושל פעולות בכמות גדולה
precision_config אופציונלי PrecisionConfig טיפוס בן מנייה (enum) לרמת הדיוק
preferred_element_type אופציונלי PrimitiveType enum of scalar element type

בדומה ל-Dot, אבל מאפשר לציין מספרים של מאפיינים מצומצמים ומקבצים גם עבור lhs וגם עבור rhs.

שדות DotDimensionNumbers סוג סמנטיקה
lhs_contracting_dimensions repeated int64 lhs מספרים של מאפיינים מצטמצמים
rhs_contracting_dimensions repeated int64 rhs מספרים של מאפיינים מצטמצמים
lhs_batch_dimensions repeated int64 lhs מספרים של מאפיינים של קבוצות
rhs_batch_dimensions repeated int64 rhs מספרים של מאפיינים של קבוצות

הפונקציה DotGeneral מבצעת את סכום המכפלות על פני מאפיינים מצטמצמים שצוינו ב-dimension_numbers.

מספרי המימדים המשויכים לחוזה מ-lhs ומ-rhs לא צריכים להיות זהים, אבל הם חייבים להיות באותו גודל.

דוגמה עם מספרי מאפיינים מצטמצמים:

lhs = { {1.0, 2.0, 3.0},
        {4.0, 5.0, 6.0} }

rhs = { {1.0, 1.0, 1.0},
        {2.0, 2.0, 2.0} }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(1);
dnums.add_rhs_contracting_dimensions(1);

DotGeneral(lhs, rhs, dnums) -> { { 6.0, 12.0},
                                 {15.0, 30.0} }

מספרי המימדים המשויכים של אצווה מ-lhs ו-rhs חייבים להיות באותם גדלים.

דוגמה עם מספרי מאפיינים של קבוצות (גודל קבוצה 2, מטריצות 2x2):

lhs = { { {1.0, 2.0},
          {3.0, 4.0} },
        { {5.0, 6.0},
          {7.0, 8.0} } }

rhs = { { {1.0, 0.0},
          {0.0, 1.0} },
        { {1.0, 0.0},
          {0.0, 1.0} } }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(2);
dnums.add_rhs_contracting_dimensions(1);
dnums.add_lhs_batch_dimensions(0);
dnums.add_rhs_batch_dimensions(0);

DotGeneral(lhs, rhs, dnums) -> {
    { {1.0, 2.0},
      {3.0, 4.0} },
    { {5.0, 6.0},
      {7.0, 8.0} } }
קלט פלט סמנטיקה
‫[b0, m, k] dot [b0, k, n] [b0, m, n] batch matmul
[b0, b1, m, k] dot [b0, b1, k, n] [b0, b1, m, n] batch matmul

מכאן נובע שמספר המימד שמתקבל מתחיל במימד של הקבוצה, lhs מימד שאינו מתכווץ או קבוצתי, ולבסוף rhs מימד שאינו מתכווץ או קבוצתי.

הפרמטר precision_config משמש לציון הגדרת הדיוק. הרמה קובעת אם החומרה צריכה לנסות ליצור עוד הוראות של קוד מכונה כדי לספק הדמיה מדויקת יותר של dtype כשצריך (כלומר, הדמיה של f32 ב-TPU שתומך רק ב-bf16 matmuls). הערכים יכולים להיות DEFAULT, ‏ HIGH, ‏ HIGHEST. פרטים נוספים זמינים בקטעים בנושא MXU.

preferred_element_type הוא אלמנט סקלרי של סוגי פלט ברמת דיוק גבוהה או נמוכה יותר שמשמשים לצבירה. preferred_element_type ממליץ על סוג הצבירה לפעולה הנתונה, אבל אין בכך ערובה. כך אפשר לצבור נתונים בחלק מהעורפים של החומרה בסוג אחר ולהמיר אותם לסוג הפלט המועדף.

מידע על StableHLO זמין במאמר בנושא StableHLO – dot_general.

ScaledDot

מידע נוסף זמין במאמר בנושא XlaBuilder::ScaledDot.

ScaledDot(lhs, lhs_scale, rhs, rhs_scale, dimension_number, precision_config,preferred_element_type)

ארגומנטים סוג סמנטיקה
lhs XlaOp מערך מסוג T
rhs XlaOp מערך מסוג T
lhs_scale XlaOp מערך מסוג T
rhs_scale XlaOp מערך מסוג T
dimension_number ScatterDimensionNumbers מספרי מאפיינים לפעולת פיזור
precision_config PrecisionConfig טיפוס בן מנייה (enum) לרמת הדיוק
preferred_element_type אופציונלי PrimitiveType enum of scalar element type

דומה ל-DotGeneral.

יוצר פעולת מכפלה נקודתית עם שינוי קנה מידה עם האופרנדים lhs,‏ lhs_scale,‏ rhs ו-rhs_scale, עם מימדים של כיווץ ואצווה שצוינו ב-dimension_numbers.

RaggedDot

מידע נוסף זמין במאמר בנושא XlaBuilder::RaggedDot.

לפירוט של חישוב RaggedDot אפשר לעיין במאמר StableHLO - chlo.ragged_dot

DynamicReshape

מידע נוסף זמין במאמר בנושא XlaBuilder::DynamicReshape.

הפעולה הזו זהה מבחינת הפונקציונליות ל-reshape, אבל הצורה של התוצאה מוגדרת באופן דינמי באמצעות output_shape.

DynamicReshape(operand, dim_sizes, new_size_bounds, dims_are_dynamic)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך N ממדי מסוג T
dim_sizes וקטור של XlaOP גודלי וקטורים של N ממדים
new_size_bounds וקטור של int63 וקטור של גבולות ב-N ממדים
dims_are_dynamic וקטור של bool ממד דינמי של N מימדים

מידע על StableHLO זמין במאמר StableHLO – dynamic_reshape.

DynamicSlice

מידע נוסף זמין במאמר בנושא XlaBuilder::DynamicSlice.

הפונקציה DynamicSlice מחלצת מערך משנה ממערך הקלט במיקום הדינמי start_indices. גודל הפלח בכל מאפיין מועבר בפרמטרים size_indices, שמציינים את נקודת הסיום של מרווחי פלחים בלעדיים בכל מאפיין: [התחלה, התחלה + גודל). הצורה של start_indices חייבת להיות חד-ממדית, והגודל של המימד צריך להיות שווה למספר המימדים של operand.

DynamicSlice(operand, start_indices, slice_sizes)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך N ממדי מסוג T
start_indices רצף של N XlaOp רשימה של N מספרים שלמים סקלריים שמכילה את אינדקס ההתחלה של הפרוסה לכל מאפיין. הערך חייב להיות גדול מ-0 או שווה ל-0.
size_indices ArraySlice<int64> רשימה של N מספרים שלמים שמכילה את גודל הפרוסה לכל מאפיין. כל ערך צריך להיות גדול מ-0, והסכום של start + size צריך להיות קטן או שווה לגודל המאפיין כדי למנוע חלוקה מודולרית של גודל המאפיין.

כדי לחשב את אינדקסים של הפרוסות האפקטיביות, צריך להחיל את ההמרה הבאה על כל אינדקס i ב-[1, N) לפני שמבצעים את הפרוסה:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - slice_sizes[i])

כך מוודאים שהפרוסה שחולצה תמיד נמצאת בתוך הגבולות ביחס למערך האופרנד. אם הפרוסה נמצאת בתוך הגבולות לפני החלת השינוי, השינוי לא משפיע.

דוגמה חד-ממדית:

let a = {0.0, 1.0, 2.0, 3.0, 4.0};
let s = {2};

DynamicSlice(a, s, {2});
// Result: {2.0, 3.0}

דוגמה דו-ממדית:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let s = {2, 1}

DynamicSlice(b, s, {2, 2});
//Result:
// { { 7.0,  8.0},
//   {10.0, 11.0} }

מידע על StableHLO זמין במאמר בנושא StableHLO – dynamic_slice.

DynamicUpdateSlice

מידע נוסף זמין במאמר בנושא XlaBuilder::DynamicUpdateSlice.

הפונקציה DynamicUpdateSlice יוצרת תוצאה שהיא הערך של מערך הקלט operand, עם פרוסת update שהוחלף ב-start_indices. הצורה של update קובעת את הצורה של מערך המשנה של התוצאה שמתעדכנת. הצורה של start_indices חייבת להיות חד-ממדית, עם גודל ממד ששווה למספר הממדים של operand.

DynamicUpdateSlice(operand, update, start_indices)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך N ממדי מסוג T
update XlaOp מערך N ממדי מסוג T שמכיל את עדכון הפרוסה. כל מאפיין של צורת העדכון צריך להיות גדול מאפס, והסכום של start + update צריך להיות קטן או שווה לגודל האופרנד בכל מאפיין כדי למנוע יצירה של אינדקסים של עדכונים מחוץ לגבולות.
start_indices רצף של N XlaOp רשימה של N מספרים שלמים סקלריים שמכילה את אינדקס ההתחלה של הפרוסה לכל מאפיין. הערך חייב להיות גדול מ-0 או שווה ל-0.

כדי לחשב את אינדקסים של הפרוסות האפקטיביות, צריך להחיל את ההמרה הבאה על כל אינדקס i ב-[1, N) לפני שמבצעים את הפרוסה:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - update.dimension_size[i])

כך אפשר לוודא שהפרוסה המעודכנת תמיד נמצאת בתוך גבולות המערך של האופרנד. אם הפרוסה נמצאת בתוך הגבולות לפני החלת השינוי, השינוי לא משפיע.

דוגמה חד-ממדית:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
let u = {5.0, 6.0}
let s = {2}

DynamicUpdateSlice(a, u, s)
// Result: {0.0, 1.0, 5.0, 6.0, 4.0}

דוגמה דו-ממדית:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let u =
{ {12.0, 13.0},
  {14.0, 15.0},
  {16.0, 17.0} }

let s = {1, 1}

DynamicUpdateSlice(b, u, s)
// Result:
// { {0.0,  1.0,  2.0},
//   {3.0, 12.0, 13.0},
//   {6.0, 14.0, 15.0},
//   {9.0, 16.0, 17.0} }

למידע על StableHLO, ראו StableHLO – dynamic_update_slice.

Erf

מידע נוסף זמין במאמר בנושא XlaBuilder::Erf.

פונקציית השגיאה x -> erf(x) לפי רכיב, כאשר:

\(\text{erf}(x) = \frac{2}{\sqrt{\pi} }\int_0^x e^{-t^2} \, dt\).

Erf(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Erf תומכת גם בארגומנט האופציונלי result_accuracy:

Erf(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

תפוגה

מידע נוסף זמין במאמר בנושא XlaBuilder::Exp.

האקספוננט הטבעי של כל רכיב x -> e^x.

Exp(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Exp תומכת גם בארגומנט האופציונלי result_accuracy:

Exp(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – exponential.

Expm1

מידע נוסף זמין במאמר בנושא XlaBuilder::Expm1.

הפונקציה הטבעית של כל רכיב פחות אחד x -> e^x - 1.

Expm1(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Expm1 תומכת גם בארגומנט האופציונלי result_accuracy:

Expm1(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – exponential_minus_one.

FFT

מידע נוסף זמין במאמר בנושא XlaBuilder::Fft.

הפעולה XLA FFT מיישמת את טרנספורמציות פורייה הישירות וההפוכות עבור קלט/פלט ממשי ומרוכב. יש תמיכה ב-FFT רב-ממדי בעד 3 צירים.

Fft(operand, ftt_type, fft_length)

ארגומנטים סוג סמנטיקה
operand XlaOp המערך שעליו מבצעים התמרת פורייה.
fft_type FftType פרטים נוספים מופיעים בטבלה שבהמשך.
fft_length ArraySlice<int64> האורכים של הצירים בתחום הזמן שעוברים טרנספורמציה. הפעולה הזו נדרשת במיוחד כדי ש-IRFFT יוכל להתאים את הגודל של הציר הפנימי ביותר, כי ל-RFFT(fft_length=[16]) יש את אותו צורה של פלט כמו ל-RFFT(fft_length=[17]).
FftType סמנטיקה
FFT ‫FFT מורכב למורכב. הצורה לא משתנה.
IFFT היפוך של FFT מורכב למורכב. הצורה לא משתנה.
RFFT העברה של FFT ממשי למרוכב. הצורה של הציר הפנימי ביותר מצטמצמת ל-fft_length[-1] // 2 + 1 אם fft_length[-1] הוא ערך שאינו אפס, ומשמיטה את החלק הצמוד ההפוך של האות שעבר טרנספורמציה מעבר לתדר נייקוויסט.
IRFFT היפוך של FFT מממשי למרוכב (כלומר, מקבלת מספר מרוכב ומחזירה מספר ממשי). הצורה של הציר הפנימי ביותר מורחבת ל-fft_length[-1] אם fft_length[-1] הוא ערך שונה מאפס, ומסיקים את החלק של האות שעבר טרנספורמציה מעבר לתדר נייקוויסט מהצמוד ההפוך של הערכים 1 עד fft_length[-1] // 2 + 1.

מידע על StableHLO זמין במאמר בנושא StableHLO – fft.

Multidimensional FFT

אם מציינים יותר מ-1, הפעולה שמתבצעת שקולה להחלת סדרה של פעולות FFT על כל אחד מהצירים הפנימיים ביותר.fft_length שימו לב: במקרים של real->complex ו-complex->real, הטרנספורמציה של הציר הפנימי ביותר מתבצעת (למעשה) קודם (RFFT; אחרון ב-IRFFT), ולכן הציר הפנימי ביותר הוא זה שגודלו משתנה. הטרנספורמציות האחרות של הצירים יהיו מורכבות->מורכבות.

פרטי ההטמעה

ה-FFT של המעבד מגובה על ידי TensorFFT של Eigen. ‫GPU FFT משתמש ב-cuFFT.

קומה

מידע נוסף זמין במאמר בנושא XlaBuilder::Floor.

הפונקציה floor לפי רכיבים x -> ⌊x⌋.

Floor(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO - floor.

פיוז'ן

מידע נוסף זמין במאמר בנושא HloInstruction::CreateFusion.

הפעולה Fusion מייצגת הוראות HLO ומשמשת כפרימיטיב ב-HLO. יכול להיות שהאופציה הזו תופיע בפריקות של HLO, אבל היא לא מיועדת ליצירה ידנית על ידי משתמשי קצה.

איסוף

הפעולה gather של XLA מחברת כמה פרוסות (כל פרוסה עם היסט שונה בזמן הריצה) של מערך קלט.

מידע על StableHLO זמין במאמר StableHLO - gather.

סמנטיקה כללית

מידע נוסף זמין במאמר בנושא XlaBuilder::Gather. תיאור פשוט יותר מופיע בקטע 'תיאור לא רשמי' שבהמשך.

gather(operand, start_indices, dimension_numbers, slice_sizes, indices_are_sorted)

ארגומנטים סוג סמנטיקה
operand XlaOp המערך שממנו אנחנו אוספים את הנתונים.
start_indices XlaOp מערך שמכיל את אינדקס ההתחלה של הפרוסות שאנחנו אוספים.
dimension_numbers GatherDimensionNumbers המימד ב-start_indices שמכיל את אינדקס ההתחלה. בהמשך מופיע תיאור מפורט.
slice_sizes ArraySlice<int64> slice_sizes[i] הוא הגבולות של הפלח במאפיין i.
indices_are_sorted bool הארגומנט שקובע אם מובטח שהאינדקסים ממוינים לפי הפונקציה שקוראת לפונקציה הנוכחית.

כדי שיהיה לכם נוח, אנחנו מוסיפים למאפיינים במערך הפלט שלא נמצאים ב-offset_dims תווית batch_dims.

הפלט הוא מערך עם batch_dims.size + offset_dims.size ממדים.

הערך operand.rank חייב להיות שווה לסכום של offset_dims.size ושל collapsed_slice_dims.size. בנוסף, הערך של slice_sizes.size צריך להיות שווה לערך של operand.rank.

אם index_vector_dim שווה ל-start_indices.rank, אנחנו מתייחסים באופן מרומז ל-start_indices כאל טנזור עם מימד נגרר 1 (כלומר, אם הצורה של start_indices היא [6,7] ו-index_vector_dim הוא 2, אנחנו מתייחסים באופן מרומז לצורה של start_indices כאל [6,7,1]).

הגבולות של מערך הפלט לאורך המימד i מחושבים באופן הבא:

  1. אם i מופיע ב-batch_dims (כלומר, שווה ל-batch_dims[k] עבור k כלשהו), אנחנו בוחרים את גבולות המאפיין המתאימים מתוך start_indices.shape, ומדלגים על index_vector_dim (כלומר, בוחרים start_indices.shape.dims[k] אם k < index_vector_dim, ואחרת בוחרים start_indices.shape.dims[k+1]).

  2. אם i מופיע ב-offset_dims (כלומר, שווה ל-offset_dims[k] עבור k מסוים), אנחנו בוחרים את הגבול המתאים מתוך slice_sizes אחרי שמתחשבים ב-collapsed_slice_dims (כלומר, אנחנו בוחרים adjusted_slice_sizes[k] כאשר adjusted_slice_sizes הוא slice_sizes עם הגבולות במדדים collapsed_slice_dims שהוסרו).

באופן רשמי, אינדקס האופרנד In שמתאים לאינדקס פלט נתון Out מחושב באופן הבא:

  1. ‫Let G = { Out[k] for k in batch_dims }. Use G to slice out a vector S such that S[i] = start_indices[Combine(G, i)] where Combine(A, b) inserts b at position index_vector_dim into A. שימו לב שההגדרה הזו ברורה גם אם G ריק: אם G ריק, אז S = start_indices.

  2. יצירת אינדקס התחלתי, Sin, ב-operand באמצעות S על ידי פיזור S באמצעות start_index_map. באופן ספציפי יותר:

    1. Sin[start_index_map[k]] = S[k] if k < start_index_map.size.

    2. Sin[_] = 0 אחרת.

  3. יוצרים אינדקס Oin לתוך operand על ידי פיזור האינדקסים בהיסט של המימדים ב-Out בהתאם לסט collapsed_slice_dims. באופן ספציפי יותר:

    1. Oin[remapped_offset_dims(k)] = Out[offset_dims[k]] if k < offset_dims.size (remapped_offset_dims is defined below).

    2. Oin[_] = 0 אחרת.

  4. In הוא Oin + Sin כאשר + הוא חיבור של כל רכיב בנפרד.

remapped_offset_dims היא פונקציה מונוטונית עם תחום [0,‏ offset_dims.size) וטווח [0, operand.rank) \ collapsed_slice_dims. לדוגמה, ‫offset_dims.size הוא 4, ‏operand.rank הוא 6 ו-collapsed_slice_dims הוא {0, 2}, אז remapped_offset_dims הוא {01,‏ 13,‏ 24,‏ 35}.

אם המדיניות indices_are_sorted מוגדרת כ-True,‏ XLA יכול להניח שהמשתמש מיין את start_indices (בסדר עולה, אחרי פיזור הערכים לפי start_index_map). אם לא, הסמנטיקה מוגדרת בהטמעה.

תיאור לא רשמי ודוגמאות

באופן לא רשמי, כל אינדקס Out במערך הפלט תואם לאלמנט E במערך האופרנד, והוא מחושב באופן הבא:

  • אנחנו משתמשים במאפייני האצווה ב-Out כדי לחפש אינדקס התחלתי מ-start_indices.

  • אנחנו משתמשים ב-start_index_map כדי למפות את אינדקס ההתחלה (שהגודל שלו עשוי להיות קטן מ-operand.rank) לאינדקס התחלה 'מלא' ב-operand.

  • אנחנו יוצרים פרוסה באופן דינמי בגודל slice_sizes באמצעות אינדקס ההתחלה המלא.

  • אנחנו משנים את הצורה של הפלח על ידי כיווץ המאפיינים collapsed_slice_dims. מכיוון שכל המאפיינים של הפרוסות המכווצות חייבים להיות בגודל 1, השינוי הזה תמיד חוקי.

  • אנחנו משתמשים בממדי ההזזה ב-Out כדי ליצור אינדקס בפלח הזה ולקבל את רכיב הקלט, E, שמתאים לאינדקס הפלט Out.

הערך של index_vector_dim מוגדר ל-start_indices.rank1 בכל הדוגמאות שבהמשך. ערכים מעניינים יותר של index_vector_dim לא משנים את הפעולה באופן מהותי, אבל הופכים את הייצוג החזותי למסורבל יותר.

כדי להבין איך כל מה שצוין למעלה מתחבר יחד, נסתכל על דוגמה שבה נאספים 5 פרוסות בצורה [8,6] ממערך [16,11]. המיקום של פרוסה במערך [16,11] יכול להיות מיוצג כווקטור אינדקס בצורה S64[2], כך שקבוצה של 5 מיקומים יכולה להיות מיוצגת כמערך S64[5,2].

אפשר לתאר את אופן הפעולה של gather כטרנספורמציה של אינדקס שלוקחת [G,O0,O1], אינדקס בצורת הפלט וממפה אותו לרכיב במערך הקלט באופן הבא:

קודם בוחרים וקטור (X,Y) ממערך האינדקסים של הפעולה gather באמצעות G. הרכיב במערך הפלט באינדקס [G,O0,O1] הוא הרכיב במערך הקלט באינדקס [X+O0,Y+O1].

slice_sizes הוא [8,6], שקובע את הטווח של O0 ו-O1, והוא בתורו קובע את הגבולות של הפלח.

פעולת האיסוף הזו פועלת כמו פלח דינמי של אצווה עם G כממד האצווה.

האינדקסים של איסוף הנתונים יכולים להיות רב-ממדיים. לדוגמה, גרסה כללית יותר של הדוגמה שלמעלה שמשתמשת במערך 'איסוף אינדקסים' בצורה [4,5,2] תתרגם אינדקסים באופן הבא:

שוב, זה פועל כפלח דינמי של קבוצה G0 וG1 כמאפייני הקבוצה. גודל הפלח הוא עדיין [8,6].

הפעולה gather ב-XLA מכלילה את הסמנטיקה הלא פורמלית שמתוארת למעלה בדרכים הבאות:

  1. אנחנו יכולים להגדיר אילו מימדים בצורת הפלט הם מימדי ההיסט (מימדים שמכילים O0, O1 בדוגמה האחרונה). מאפייני אצווה של פלט (מאפיינים שמכילים G0, G1 בדוגמה האחרונה) מוגדרים כמאפייני הפלט שלא מוגדרים כמאפייני היסט.

  2. יכול להיות שמספר המאפיינים של היסט הפלט שמוצגים באופן מפורש בצורת הפלט קטן ממספר המאפיינים של הקלט. למאפיינים ה'חסרים' האלה, שמופיעים במפורש כ-collapsed_slice_dims, צריך להיות גודל פלח של 1. מכיוון שגודל הפרוסה שלהם הוא 1, האינדקס התקף היחיד שלהם הוא 0, והשמטה שלהם לא יוצרת עמימות.

  3. יכול להיות שלפרוסה שחולצה מהמערך Gather Indices (מספרים X ו-Y בדוגמה האחרונה) יהיו פחות רכיבים ממספר המימדים של מערך הקלט, ומיפוי מפורש קובע איך להרחיב את האינדקס כך שיהיה לו אותו מספר מימדים כמו לקלט.

כדוגמה אחרונה, אנחנו משתמשים ב-(2) וב-(3) כדי להטמיע את tf.gather_nd:

הפרמטרים G0 ו-G1 משמשים לחיתוך אינדקס התחלתי ממערך האינדקסים של הפעולה gather כרגיל, אלא שהאינדקס ההתחלתי מכיל רק רכיב אחד, X. באופן דומה, יש רק אינדקס אחד של היסט בפלט עם הערך O0. עם זאת, לפני השימוש בהם כאינדקסים במערך הקלט, הם מורחבים בהתאם ל-Gather Index Mapping (start_index_map בתיאור הרשמי) ול-Offset Mapping (remapped_offset_dims בתיאור הרשמי) ל-‎[X,0] ‎ ול-‎[0,O0] ‎ בהתאמה, ומתקבל ‎[X,O0]‎. במילים אחרות, אינדקס הפלט ‎[G0,G1,O0] ‎ ממופה לאינדקס הקלט ‎[GatherIndices[G0,G1,0],O0]‎, וזה נותן לנו את הסמנטיקה של tf.gather_nd.

מספר הפנייה שלך הוא slice_sizes.[1,11] באופן אינטואיטיבי, המשמעות היא שכל אינדקס X במערך האינדקסים של הפעולה gather בוחר שורה שלמה, והתוצאה היא שרשור של כל השורות האלה.

GetDimensionSize

מידע נוסף זמין במאמר בנושא XlaBuilder::GetDimensionSize.

הפונקציה מחזירה את הגודל של המימד הנתון של האופרנד. האופרנד חייב להיות בצורת מערך.

GetDimensionSize(operand, dimension)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך קלט n ממדי
dimension int64 ערך במרווח [0, n) שמציין את המאפיין

מידע על StableHLO זמין במאמר StableHLO – get_dimension_size.

GetTupleElement

מידע נוסף זמין במאמר בנושא XlaBuilder::GetTupleElement.

אינדקסים לתוך טאפל עם ערך קבוע בזמן ההידור.

הערך חייב להיות קבוע בזמן ההידור, כדי שהסקת הצורה תוכל לקבוע את סוג הערך שמתקבל.

זה דומה ל-std::get<int N>(t) ב-C++. באופן עקרוני:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);
let element_1: s32 = gettupleelement(t, 1); // Inferred shape matches s32.

מידע נוסף מופיע במאמר tf.tuple.

GetTupleElement(tuple_data, index)

ארגומנט סוג סמנטיקה
tuple_data XlaOP הטופל
index int64 אינדקס של צורת טאפל

מידע על StableHLO זמין במאמר StableHLO – get_tuple_element.

Imag

מידע נוסף זמין במאמר בנושא XlaBuilder::Imag.

החלק המדומה של צורה מרוכבת (או ממשית) לפי אלמנט. x -> imag(x). אם האופרנד הוא מסוג נקודה צפה, הפונקציה מחזירה 0.

Imag(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר בנושא StableHLO - imag.

בתוך הפיד

מידע נוסף זמין במאמר בנושא XlaBuilder::Infeed.

Infeed(shape, config)

ארגומנט סוג סמנטיקה
shape Shape צורת הנתונים שנקראים מממשק Infeed. השדה layout של הצורה צריך להיות מוגדר כך שיתאים לפריסה של הנתונים שנשלחים למכשיר. אחרת, ההתנהגות שלו לא מוגדרת.
config אופציונלי string ההגדרה של הפעולה.

קוראת פריט נתונים יחיד מממשק הסטרימינג המרומז של Infeed במכשיר, מפרשת את הנתונים כצורה הנתונה והפריסה שלהם ומחזירה XlaOp של הנתונים. מותר להשתמש בכמה פעולות Infeed בחישוב, אבל צריך להיות סדר כולל בין הפעולות האלה. לדוגמה, שני Infeed בקוד שלמטה מסודרים בסדר מלא כי יש תלות בין לולאות ה-while.

result1 = while (condition, init = init_value) {
  Infeed(shape)
  }

result2 = while (condition, init = result1) {
  Infeed(shape)
  }

אין תמיכה בצורות של טאפל מוטמע. במקרה של צורת טופל ריקה, הפעולה Infeed היא למעשה פעולה ללא פעולה (no-op) והיא ממשיכה בלי לקרוא נתונים מה-Infeed של המכשיר.

מידע על StableHLO זמין במאמר StableHLO - infeed.

Iota

מידע נוסף זמין במאמר בנושא XlaBuilder::Iota.

Iota(shape, iota_dimension)

יוצר מחרוזת קבועה במכשיר במקום העברה פוטנציאלית גדולה של מארח. יוצרת מערך עם צורה שצוינה ומכילה ערכים שמתחילים מאפס ועולים באחד לאורך המימד שצוין. במקרים של סוגי נתונים של נקודה צפה, המערך שנוצר שווה ל-ConvertElementType(Iota(...)), כאשר Iota הוא סוג נתונים של מספר שלם וההמרה היא לסוג נתונים של נקודה צפה.

ארגומנטים סוג סמנטיקה
shape Shape הצורה של המערך שנוצר על ידי Iota()
iota_dimension int64 המאפיין שלפיו יבוצע הגידול.

לדוגמה, הפקודה Iota(s32[4, 8], 0) מחזירה

[[0, 0, 0, 0, 0, 0, 0, 0 ],
 [1, 1, 1, 1, 1, 1, 1, 1 ],
 [2, 2, 2, 2, 2, 2, 2, 2 ],
 [3, 3, 3, 3, 3, 3, 3, 3 ]]

אפשרות החזרה במחיר Iota(s32[4, 8], 1)

[[0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ]]

מידע על StableHLO זמין במאמר בנושא StableHLO – iota.

IsFinite

מידע נוסף זמין במאמר בנושא XlaBuilder::IsFinite.

הפונקציה בודקת אם כל רכיב של operand הוא סופי, כלומר לא אינסוף חיובי או שלילי, ולא NaN. הפונקציה מחזירה מערך של ערכים PRED עם אותה צורה כמו הקלט, כאשר כל אלמנט הוא true אם ורק אם אלמנט הקלט התואם הוא סופי.

IsFinite(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO – is_finite.

יומן

מידע נוסף זמין במאמר בנושא XlaBuilder::Log.

לוגריתם טבעי של כל רכיב x -> ln(x).

Log(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Log תומכת גם בארגומנט האופציונלי result_accuracy:

Log(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר בנושא StableHLO – יומן.

Log1p

מידע נוסף זמין במאמר בנושא XlaBuilder::Log1p.

לוגריתם טבעי מוזז לפי רכיב x -> ln(1+x).

Log1p(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Log1p תומכת גם בארגומנט האופציונלי result_accuracy:

Log1p(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO - log_plus_one.

לוגיסטי

מידע נוסף זמין במאמר בנושא XlaBuilder::Logistic.

חישוב פונקציה לוגיסטית לפי רכיבים x -> logistic(x).

Logistic(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Logistic תומכת גם בארגומנט האופציונלי result_accuracy:

Logistic(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – לוגיסטיקה.

מפה

מידע נוסף זמין במאמר בנושא XlaBuilder::Map.

Map(operands..., computation, dimensions)

ארגומנטים סוג סמנטיקה
operands רצף של N XlaOps ‫N מערכים מהסוגים T0..T{N-1}
computation XlaComputation חישוב מסוג T_0, T_1, .., T_{N + M -1} -> S עם N פרמטרים מסוג T ו-M פרמטרים מסוג שרירותי.
dimensions int64 array מערך של מימדי מיפוי
static_operands רצף של N XlaOps פעולות סטטיות לפעולת המפה

הפונקציה מחילה פונקציה סקלרית על המערכים operands שצוינו, ומחזירה מערך באותם ממדים שבהם כל רכיב הוא התוצאה של הפונקציה הממופה שהוחלה על הרכיבים התואמים במערכי הקלט.

הפונקציה הממופה היא חישוב שרירותי עם ההגבלה שיש לה N קלטים מסוג סקלרי T ופלט יחיד מסוג S. לפלט יש את אותם הממדים כמו לאופרנדים, רק שסוג הרכיב T מוחלף ב-S.

לדוגמה: Map(op1, op2, op3, computation, par1) ממפה את elem_out <- computation(elem1, elem2, elem3, par1) בכל אינדקס (רב-ממדי) במערכי הקלט כדי ליצור את מערך הפלט.

מידע על StableHLO זמין במאמר StableHLO – map.

מקסימום

מידע נוסף זמין במאמר בנושא XlaBuilder::Max.

מבצעת פעולת מקסימום לפי רכיבים בטנסורים lhs ו-rhs.

Max(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור בממדים שונים ל-Max:

Max(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

למידע על StableHLO, ראו StableHLO – maximum.

מינימום

מידע נוסף זמין במאמר בנושא XlaBuilder::Min.

מבצעת פעולת min לפי רכיבים ב-lhs וב-rhs.

Min(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור מממד אחר עבור Min:

Min(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – מינימום.

Mul

מידע נוסף זמין במאמר בנושא XlaBuilder::Mul.

מבצעת מכפלה של כל רכיב ב-lhs עם הרכיב התואם ב-rhs.

Mul(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהרחבת שידור מממד שונה עבור Mul:

Mul(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר בנושא StableHLO – multiply.

Neg

מידע נוסף זמין במאמר בנושא XlaBuilder::Neg.

שלילה של כל רכיב x -> -x.

Neg(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

למידע על StableHLO, ראו StableHLO – negate

לא

מידע נוסף זמין במאמר בנושא XlaBuilder::Not.

שלילה לוגית לפי רכיבים x -> !(x).

Not(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO - not.

OptimizationBarrier

מידע נוסף זמין במאמר בנושא XlaBuilder::OptimizationBarrier.

חוסם כל מעבר אופטימיזציה של חישובים מעבר למחסום.

OptimizationBarrier(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה מוודאת שכל ערכי הקלט מוערכים לפני כל האופרטורים שתלויים בפלט של המחסום.

מידע על StableHLO זמין במאמר StableHLO - optimization_barrier.

או

מידע נוסף זמין במאמר בנושא XlaBuilder::Or.

מבצעת פעולת OR בין כל רכיב ב-lhs לבין הרכיב התואם ב-rhs .

Or(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור עם ממדים שונים עבור Or:

Or(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO - or.

הזנת נתונים

מידע נוסף זמין במאמר בנושא XlaBuilder::Outfeed.

כותב את הקלט לפיד.

Outfeed(operand, shape_with_layout, outfeed_config)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T
shape_with_layout Shape הגדרה של פריסת הנתונים שמועברים
outfeed_config string קבוע של הגדרה להוראה Outfeed

shape_with_layout מעביר את הצורה שרוצים להוציא.

מידע על StableHLO זמין במאמר StableHLO - outfeed.

רפידה

מידע נוסף זמין במאמר בנושא XlaBuilder::Pad.

Pad(operand, padding_value, padding_config)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T
padding_value XlaOp סקלר מסוג T למילוי הריפוד שנוסף
padding_config PaddingConfig כמות הריווח בשני הקצוות (נמוך, גבוה) ובין הרכיבים של כל מימד

הפונקציה מרחיבה את המערך operand שצוין על ידי הוספת ערכי מילוי מסביב למערך וגם בין הרכיבים של המערך עם הערך padding_value שצוין. ‫padding_config מציין את כמות הריווח בשוליים ואת הריווח הפנימי לכל מימד.

PaddingConfig הוא שדה חוזר של PaddingConfigDimension, שמכיל שלושה שדות לכל מאפיין: edge_padding_low,‏ edge_padding_high ו-interior_padding.

הערכים edge_padding_low ו-edge_padding_high מציינים את כמות הריווח שנוספה בקצה הנמוך (ליד אינדקס 0) ובקצה הגבוה (ליד האינדקס הגבוה ביותר) של כל מימד, בהתאמה. הערך של הריווח הפנימי יכול להיות שלילי. הערך המוחלט של ריווח פנימי שלילי מציין את מספר הרכיבים שצריך להסיר מהמאפיין שצוין.

interior_padding מציין את כמות הריווח שנוספה בין שני רכיבים בכל מימד. הערך לא יכול להיות שלילי. הריווח הפנימי מתבצע מבחינה לוגית לפני הריווח החיצוני, ולכן במקרה של ריווח חיצוני שלילי, הרכיבים מוסרים מהאופרנד עם הריווח הפנימי.

הפעולה הזו לא מבצעת כלום אם כל זוגות המרווחים הפנימיים בקצוות הם (0, 0) וכל ערכי המרווחים הפנימיים הם 0. בדוגמה הבאה מוצגים ערכים שונים של edge_padding ו-interior_padding במערך דו-ממדי.

מידע על StableHLO זמין במאמר StableHLO - pad.

פרמטר

מידע נוסף זמין במאמר בנושא XlaBuilder::Parameter.

Parameter מייצג ארגומנט שמוזן לחישוב.

PartitionID

מידע נוסף זמין במאמר בנושא XlaBuilder::BuildPartitionId.

יוצרת partition_id של התהליך הנוכחי.

PartitionID(shape)

ארגומנטים סוג סמנטיקה
shape Shape צורת הנתונים

המחרוזת PartitionID עשויה להופיע בקובצי dump של HLO, אבל היא לא מיועדת ליצירה ידנית על ידי משתמשי קצה.

מידע על StableHLO זמין במאמר בנושא StableHLO – partition_id.

PopulationCount

מידע נוסף זמין במאמר בנושא XlaBuilder::PopulationCount.

הפונקציה מחשבת את מספר הביטים שמוגדרים בכל רכיב של operand.

PopulationCount(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

למידע על StableHLO, ראו StableHLO – popcnt.

פאו

מידע נוסף זמין במאמר בנושא XlaBuilder::Pow.

מבצע העלאה בחזקה של lhs ב-rhs ברמת הרכיב.

Pow(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת גרסה חלופית עם תמיכה בשידור בממדים שונים עבור Pow:

Pow(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – power.

Real

מידע נוסף זמין במאמר בנושא XlaBuilder::Real.

החלק הממשי של צורה מרוכבת (או ממשי) לפי אלמנט. x -> real(x). אם האופרנד הוא מסוג נקודה צפה, הפונקציה Real מחזירה את אותו ערך.

Real(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר בנושא StableHLO - real.

Recv

מידע נוסף זמין במאמר בנושא XlaBuilder::Recv.

Recv,‏ RecvWithTokens ו-RecvToHost הם פעולות שמשמשות כפרימיטיבים של תקשורת ב-HLO. הפעולות האלה מופיעות בדרך כלל בפריקות של HLO כחלק מהעברת קלט/פלט ברמה נמוכה או העברה בין מכשירים, אבל הן לא מיועדות לבנייה ידנית על ידי משתמשי קצה.

Recv(shape, handle)

ארגומנטים סוג סמנטיקה
shape Shape צורת הנתונים שיתקבלו
handle ChannelHandle מזהה ייחודי לכל זוג של שליחה/קבלה

מקבל נתונים מהצורה שצוינה מהוראת Send בחישוב אחר שמשתמש באותו שם של ערוץ. מחזירה XlaOp לנתונים שהתקבלו.

מידע על StableHLO זמין במאמר StableHLO - recv.

RecvDone

מידע נוסף זמין במאמרים בנושא HloInstruction::CreateRecv וHloInstruction::CreateRecvDone.

בדומה ל-Send, פעולת Recv של לקוח ה-API מייצגת תקשורת סינכרונית. עם זאת, ההוראה מפורקת באופן פנימי ל-2 הוראות HLO‏ (Recv ו-RecvDone) כדי לאפשר העברות נתונים אסינכרוניות.

Recv(const Shape& shape, int64 channel_id)

הפונקציה מקצה את המשאבים שנדרשים לקבלת נתונים מהוראה Send עם אותו channel_id. מחזירה הקשר למשאבים שהוקצו, שמשמש בהוראה הבאה RecvDone להמתנה להשלמת העברת הנתונים. ההקשר הוא טאפל של {מאגר לקליטת נתונים (צורה), מזהה בקשה (U32)} ואפשר להשתמש בו רק בהוראה RecvDone.

בהינתן הקשר שנוצר על ידי הוראה Recv, המערכת ממתינה להשלמת העברת הנתונים ומחזירה את הנתונים שהתקבלו.

הקטנה

מידע נוסף זמין במאמר בנושא XlaBuilder::Reduce.

מפעילה פונקציית צמצום על מערך אחד או יותר במקביל.

Reduce(operands..., init_values..., computation, dimensions_to_reduce)

ארגומנטים סוג סמנטיקה
operands רצף של N XlaOp ‫N מערכים מסוג T_0,..., T_{N-1}.
init_values רצף של N XlaOp ‫N סקלרים מהסוגים T_0,..., T_{N-1}.
computation XlaComputation חישוב מסוג T_0,..., T_{N-1}, T_0, ...,T_{N-1} -> Collate(T_0,..., T_{N-1}).
dimensions_to_reduce int64 array מערך לא מסודר של מימדים לצמצום.

כאשר:

  • הערך של n חייב להיות גדול מ-1 או שווה לו.
  • החישוב צריך להיות אסוציאטיבי בקירוב (ראו בהמשך).
  • לכל מערכי הקלט צריכים להיות אותם ממדים.
  • כל הערכים ההתחלתיים צריכים ליצור זהות תחת computation.
  • אם N = 1, אז Collate(T) הוא T.
  • אם N > 1, Collate(T_0, ..., T_{N-1}) הוא טאפל של N רכיבים מסוג T.

הפעולה הזו מצמצמת מימד אחד או יותר של כל מערך קלט לערכים סקלריים. מספר המימדים של כל מערך שמוחזר הוא number_of_dimensions(operand) - len(dimensions). הפלט של הפעולה הוא Collate(Q_0, ..., Q_N), כאשר Q_i הוא מערך מסוג T_i, והממדים שלו מתוארים בהמשך.

מותר לשייך מחדש את חישוב ההפחתה למערכות עורפיות שונות. הדבר עלול להוביל להבדלים מספריים, כי חלק מפונקציות הצמצום כמו חיבור לא אסוציאטיביות עבור מספרים ממשיים. עם זאת, אם טווח הנתונים מוגבל, פעולת החיבור של מספרים ממשיים קרובה מספיק להיות אסוציאטיבית לרוב השימושים המעשיים.

מידע על StableHLO זמין במאמר בנושא StableHLO – reduce.

דוגמאות

כשמצמצמים לאורך מימד אחד במערך חד-ממדי יחיד עם הערכים [10, 11, 12, 13], עם פונקציית הצמצום f (זה computation), אפשר לחשב את זה כך:

f(10, f(11, f(12, f(init_value, 13)))

אבל יש גם הרבה אפשרויות אחרות, למשל:

f(init_value, f(f(10, f(init_value, 11)), f(f(init_value, 12), f(init_value, 13))))

הדוגמה הבאה היא פסאודו-קוד גס שמראה איך אפשר להטמיע צמצום, באמצעות סיכום כחישוב הצמצום עם ערך התחלתי של 0.

result_shape <- remove all dims in dimensions from operand_shape

# Iterate over all elements in result_shape. The number of r's here is equal
# to the number of dimensions of the result.
for r0 in range(result_shape[0]), r1 in range(result_shape[1]), ...:
  # Initialize this result element
  result[r0, r1...] <- 0

  # Iterate over all the reduction dimensions
  for d0 in range(dimensions[0]), d1 in range(dimensions[1]), ...:
    # Increment the result element with the value of the operand's element.
    # The index of the operand's element is constructed from all ri's and di's
    # in the right order (by construction ri's and di's together index over the
    # whole operand shape).
    result[r0, r1...] += operand[ri... di]

דוגמה לצמצום של מערך דו-ממדי (מטריצה). לצורה יש 2 מימדים, מימד 0 בגודל 2 ומימד 1 בגודל 3:

תוצאות של צמצום מאפיינים 0 או 1 באמצעות פונקציית 'הוספה':

שימו לב ששתי תוצאות הצמצום הן מערכים חד-ממדיים. בתרשים, אחד מוצג כעמודה והשני כשורה רק לצורך נוחות ויזואלית.

דוגמה מורכבת יותר: מערך תלת-ממדי. מספר המאפיינים הוא 3, מאפיין 0 בגודל 4, מאפיין 1 בגודל 2 ומאפיין 2 בגודל 3. כדי לפשט את הדברים, הערכים 1 עד 6 משוכפלים במאפיין 0.

בדומה לדוגמה הדו-ממדית, אפשר לצמצם רק ממד אחד. אם מצמצמים את מאפיין 0, למשל, מקבלים מערך דו-ממדי שבו כל הערכים במאפיין 0 קופלו לתוך סקלר:

|  4   8  12 |
| 16  20  24 |

אם נצמצם את מאפיין 2, נקבל גם מערך דו-ממדי שבו כל הערכים במאפיין 2 קופלו לערך סקלרי:

| 6  15 |
| 6  15 |
| 6  15 |
| 6  15 |

שימו לב: הסדר היחסי בין המאפיינים שנותרו בקלט נשמר בפלט, אבל יכול להיות שלחלק מהמאפיינים יוקצו מספרים חדשים (כי מספר המאפיינים משתנה).

אפשר גם לצמצם כמה מאפיינים. הוספה של מאפיינים מצמצמים 0 ו-1 יוצרת את המערך החד-ממדי [20, 28, 36].

צמצום המערך התלת-ממדי בכל המימדים שלו יוצר את הסקלר 84.

Variadic Reduce

כשמשתמשים ב-N > 1, הפונקציה reduce קצת יותר מורכבת, כי היא מופעלת בו-זמנית על כל ערכי הקלט. האופרנדים מסופקים לחישוב בסדר הבא:

  • הפעלת ערך מופחת לאופרנד הראשון
  • ...
  • הפעלת ערך מופחת לאופרנד ה-N
  • ערך הקלט של האופרנד הראשון
  • ...
  • ערך הקלט של האופרנד ה-N

לדוגמה, נניח שיש לכם את פונקציית הצמצום הבאה, שאפשר להשתמש בה כדי לחשב את המקסימום ואת argmax של מערך חד-ממדי במקביל:

f: (Float, Int, Float, Int) -> Float, Int
f(max, argmax, value, index):
  if value >= max:
    return (value, index)
  else:
    return (max, argmax)

עבור מערכי קלט חד-ממדיים V = Float[N], K = Int[N] וערכי אתחול I_V = Float, I_K = Int, התוצאה f_(N-1) של צמצום המערך לאורך מימד הקלט היחיד שווה לשימוש הרקורסיבי הבא:

f_0 = f(I_V, I_K, V_0, K_0)
f_1 = f(f_0.first, f_0.second, V_1, K_1)
...
f_(N-1) = f(f_(N-2).first, f_(N-2).second, V_(N-1), K_(N-1))

הפעלת הפונקציה הזו על מערך של ערכים ועל מערך של אינדקסים עוקבים (כלומר iota) תגרום לאיטרציה משותפת על המערכים, ותחזיר טופל שמכיל את הערך המקסימלי ואת האינדקס התואם.

ReducePrecision

מידע נוסף זמין במאמר בנושא XlaBuilder::ReducePrecision.

הפונקציה מדמה את ההשפעה של המרת ערכים של נקודה צפה לפורמט עם דיוק נמוך יותר (כמו IEEE-FP16) וחזרה לפורמט המקורי. אפשר לציין באופן שרירותי את מספר הסיביות של המעריך והמנטיסה בפורמט עם דיוק נמוך יותר, אבל יכול להיות שלא כל גדלי הסיביות נתמכים בכל יישומי החומרה.

ReducePrecision(operand, exponent_bits, mantissa_bits)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג נקודה צפה T.
exponent_bits int32 מספר הביטים של המעריך בפורמט עם דיוק נמוך יותר
mantissa_bits int32 מספר הביטים של המנטיסה בפורמט עם דיוק נמוך יותר

התוצאה היא מערך מסוג T. ערכי הקלט מעוגלים לערך הקרוב ביותר שאפשר לייצג עם מספר הביטים של המנטיסה שצוין (באמצעות סמנטיקה של 'עיגול למספר הזוגי הקרוב ביותר'), וכל הערכים שחורגים מהטווח שצוין על ידי מספר הביטים של המעריך מוצמדים לאינסוף חיובי או שלילי. הערכים של NaN נשמרים, אבל יכול להיות שהם יומרו לערכים קנוניים של NaN.

בפורמט עם הדיוק הנמוך יותר צריך להיות לפחות ביט אחד של חזקה (כדי להבחין בין ערך אפס לבין אינסוף, כי לשניהם יש מנטיסה אפסית), ומספר הביטים של המנטיסה צריך להיות לא שלילי. יכול להיות שמספר הביטים של המעריך או המנטיסה יהיה גדול מהערך המתאים לסוג T. במקרה כזה, החלק המתאים של ההמרה פשוט לא יבצע פעולה.

למידע על StableHLO, אפשר לעיין במאמר בנושא StableHLO – reduce_precision.

ReduceScatter

מידע נוסף זמין במאמר בנושא XlaBuilder::ReduceScatter.

‫ReduceScatter היא פעולה קולקטיבית שמבצעת למעשה AllReduce ואז מפזרת את התוצאה על ידי פיצול שלה ל-shard_count בלוקים לאורך scatter_dimension, והרפליקה i בקבוצת הרפליקות מקבלת את ה-shard‏ ith.

ReduceScatter(operand, computation, scatter_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך או טופל לא ריק של מערכים לצמצום בין העותקים.
computation XlaComputation חישוב הצמצום
scatter_dimension int64 המאפיין לפיזור.
shard_count int64 מספר הבלוקים לפיצול scatter_dimension
replica_groups ReplicaGroup וקטור קבוצות שביניהן מתבצעות ההפחתות
channel_id אופציונלי ChannelHandle מזהה ערוץ אופציונלי לתקשורת בין מודולים
layout אופציונלי Layout פריסת זיכרון שמוגדרת על ידי המשתמש
use_global_device_ids אופציונלי bool סימון שהוגדר על ידי המשתמש
  • אם operand הוא טאפל של מערכים, הפעולה reduce-scatter מתבצעת על כל רכיב בטאפל.
  • replica_groups היא רשימה של קבוצות העתקים שביניהן מתבצעת ההפחתה (אפשר לאחזר את מזהה ההעתק של ההעתק הנוכחי באמצעות ReplicaId). הסדר של ההעתקים בכל קבוצה קובע את הסדר שבו התוצאה של פעולת ה-all-reduce תפוזר. replica_groups השדה צריך להיות ריק (ואז כל העותקים שייכים לקבוצה אחת), או להכיל את אותו מספר רכיבים כמו מספר העותקים. אם יש יותר מקבוצת העתקים, כולן צריכות להיות באותו גודל. לדוגמה, replica_groups = {0, 2}, {1, 3} מבצע צמצום בין העותקים 0 ו-2, ובין 1 ו-3, ואז מפזר את התוצאה.
  • shard_count הוא הגודל של כל קבוצת עותקים. אנחנו צריכים את זה במקרים שבהם השדות replica_groups ריקים. אם replica_groups לא ריק, shard_count חייב להיות שווה לגודל של כל קבוצת עותקים.
  • channel_id משמש לתקשורת בין מודולים: רק פעולות reduce-scatter עם אותו channel_id יכולות לתקשר ביניהן.
  • layout מידע נוסף על פריסות זמין במאמר xla::shapes.
  • use_global_device_ids הוא דגל שצוין על ידי המשתמש. כש-false(ברירת מחדל) המספרים ב-replica_groups הם ReplicaId כש-true המספרים ב-replica_groups מייצגים מזהה גלובלי של (ReplicaID*partition_count + partition_id). לדוגמה:
    • עם 2 עותקים ו-4 מחיצות,
    • replica_groups={ {0,1,4,5},{2,3,6,7} } and use_global_device_ids=true
    • ‫group[0] = (0,0), (0,1), (1,0), (1,1)
    • ‫group[1] = (0,2), (0,3), (1,2), (1,3)
    • כאשר כל צמד הוא (replica_id, partition_id).

צורת הפלט היא צורת הקלט עם scatter_dimension שהוקטן פי shard_count. לדוגמה, אם יש שני עותקים והאופרנד הוא [1.0, 2.25] ו-[3.0, 5.25] בהתאמה בשני העותקים, ערך הפלט מהפעולה הזו שבה scatter_dim הוא 0 יהיה [4.0] בעותק הראשון ו-[7.5] בעותק השני.

מידע על StableHLO זמין במאמר בנושא StableHLO – reduce_scatter.

ReduceScatter - Example 1 - StableHLO

דוגמה לזרימת נתונים של ReduceScatter עבור StableHLO

בדוגמה שלמעלה, יש 2 רפליקות שמשתתפות ב-ReduceScatter. בכל עותק, לאופרנד יש צורה f32[2,4]. מתבצעת פעולת all-reduce (סכום) בין העותקים, ונוצר ערך מוקטן של צורה f32[2,4] בכל עותק. לאחר מכן, הערך המצומצם הזה מפולח ל-2 חלקים לאורך מאפיין 1, כך שלכל חלק יש צורה f32[2,2]. כל רפליקה בקבוצת התהליכים מקבלת את החלק שמתאים למיקום שלה בקבוצה. כתוצאה מכך, הפלט בכל עותק הוא בצורה f32[2,2].

ReduceWindow

מידע נוסף זמין במאמר בנושא XlaBuilder::ReduceWindow.

הפונקציה מחילה פונקציית צמצום על כל הרכיבים בכל חלון של רצף של מערכים רב-ממדיים, ומפיקה מערך רב-ממדי יחיד או טופל של N מערכים רב-ממדיים כפלט. לכל מערך פלט יש את אותו מספר של רכיבים כמו מספר המיקומים התקינים של החלון. שכבת איגום יכולה להיות מיוצגת כ-ReduceWindow. בדומה ל-Reduce, הערך של computation שמוחל תמיד מועבר ל-init_values בצד ימין.

ReduceWindow(operands..., init_values..., computation, window_dimensions, window_strides, padding)

ארגומנטים סוג סמנטיקה
operands N XlaOps רצף של מערכים רב-ממדיים של סוגים T_0,..., T_{N-1}, כל אחד מהם מייצג את אזור הבסיס שבו החלון ממוקם.
init_values N XlaOps ‫N ערכי ההתחלה של הפעולה, אחד לכל אחד מ-N האופרנדים. פרטים נוספים מופיעים במאמר בנושא הפחתה.
computation XlaComputation פונקציית צמצום מסוג T_0, ..., T_{N-1}, T_0, ..., T_{N-1} -> Collate(T_0, ..., T_{N-1}), שמוחלת על רכיבים בכל חלון של כל האופרנדים של הקלט.
window_dimensions ArraySlice<int64> מערך של מספרים שלמים לערכי מאפייני חלון
window_strides ArraySlice<int64> מערך של מספרים שלמים לערכי הצעד של החלון
base_dilations ArraySlice<int64> מערך של מספרים שלמים לערכי הרחבה של הבסיס
window_dilations ArraySlice<int64> מערך של מספרים שלמים לערכי הרחבת חלון
padding Padding סוג הריפוד של החלון (Padding::kSame, שמרפד כך שצורת הפלט תהיה זהה לצורת הקלט אם הצעד הוא 1, או Padding::kValid, שלא משתמש בריפוד ומפסיק את החלון ברגע שהוא כבר לא מתאים)

כאשר:

  • הערך של n חייב להיות גדול מ-1 או שווה לו.
  • לכל מערכי הקלט צריכים להיות אותם ממדים.
  • אם N = 1, אז Collate(T) הוא T.
  • אם N > 1, Collate(T_0, ..., T_{N-1}) הוא טאפל של N רכיבים מסוג (T0,...T{N-1}).

מידע על StableHLO זמין במאמר בנושא StableHLO – reduce_window.

‫ReduceWindow – דוגמה 1

הקלט הוא מטריצה בגודל [4x6], והמימדים של window_dimensions ושל window_stride_dimensions הם [2x3].

// Create a computation for the reduction (maximum).
XlaComputation max;
{
  XlaBuilder builder(client_, "max");
  auto y = builder.Parameter(0, ShapeUtil::MakeShape(F32, {}), "y");
  auto x = builder.Parameter(1, ShapeUtil::MakeShape(F32, {}), "x");
  builder.Max(y, x);
  max = builder.Build().value();
}

// Create a ReduceWindow computation with the max reduction computation.
XlaBuilder builder(client_, "reduce_window_2x3");
auto shape = ShapeUtil::MakeShape(F32, {4, 6});
auto input = builder.Parameter(0, shape, "input");
builder.ReduceWindow(
    input,
    /*init_val=*/builder.ConstantLiteral(LiteralUtil::MinValue(F32)),
    *max,
    /*window_dimensions=*/{2, 3},
    /*window_stride_dimensions=*/{2, 3},
    Padding::kValid);

צעד של 1 במאפיין מציין שהמיקום של חלון במאפיין הוא במרחק של אלמנט אחד מהחלון הסמוך לו. כדי לציין שלא יהיה חפיפה בין החלונות, הערך של window_stride_dimensions צריך להיות שווה לערך של window_dimensions. באיור שלמטה מוצג שימוש בשני ערכים שונים של stride. הריפוד מוחל על כל מאפיין של הקלט, והחישובים זהים לאלה שמתבצעים כאילו הקלט הגיע עם המאפיינים שיש לו אחרי הריפוד.

כדי לראות דוגמה לריפוד לא טריוויאלי, נניח שרוצים לחשב את הערך המינימלי של חלון ההפחתה (הערך ההתחלתי הוא MAX_FLOAT) עם המימד 3 והצעד 2 במערך הקלט [10000, 1000, 100, 10, 1]. הפונקציה Padding kValid מחשבת ערכי מינימום על פני שני חלונות תקפים: [10000, 1000, 100] ו-[100, 10, 1], והתוצאה היא הפלט [100, 1]. הפונקציה Padding kSame מוסיפה בהתחלה רכיבים למערך משני הצדדים, כך שהצורה אחרי הפונקציה reduce-window תהיה זהה לצורה של הקלט עבור הצעד הראשון, ומתקבל [MAX_VALUE, 10000, 1000, 100, 10, 1, MAX_VALUE]. הפעלת הפונקציה reduce-window על המערך עם הריפוד פועלת על שלושה חלונות [MAX_VALUE, 10000, 1000], [1000, 100, 10], [10, 1, MAX_VALUE] ומחזירה את הערך [1000, 10, 1].

סדר החישוב של פונקציית הצמצום הוא שרירותי ועשוי להיות לא דטרמיניסטי. לכן, פונקציית הצמצום לא צריכה להיות רגישה מדי לשיוך מחדש. פרטים נוספים מופיעים בדיון על אסוציאטיביות בהקשר של Reduce.

‫ReduceWindow – דוגמה 2 – StableHLO

דוגמה ל-ReduceWindow dataflow ל-StableHLO

בדוגמה שלמעלה:

קלט) לאופרנד יש צורת קלט של S32[3,2]. עם הערכים [[1,2],[3,4],[5,6]]

שלב 1) הרחבה בסיסית עם פקטור 2 לאורך מימד השורה מוסיפה חורים בין כל שורה של האופרנד. אחרי ההרחבה, מוחל ריווח של 2 שורות בחלק העליון ושורה אחת בחלק התחתון. כתוצאה מכך, הטנסור הופך לגבוה יותר.

שלב 2) מוגדר חלון בצורה [2,1] עם הרחבת חלון [3,1]. המשמעות היא שבכל חלון נבחרים שני רכיבים מאותה עמודה, אבל הרכיב השני נלקח שלוש שורות מתחת לרכיב הראשון ולא ישירות מתחתיו.

שלב 3) החלונות מוזזים על פני האופרנד עם צעד [4,1]. כתוצאה מכך, החלון יזוז ארבע שורות למטה בכל פעם, ויזוז עמודה אחת בכל פעם אופקית. תאי הריפוד מלאים בערך init_value (במקרה הזה init_value = 0). המערכת מתעלמת מערכים ש 'נופלים' לתאי ההרחבה. בגלל הצעד והריפוד, חלק מהחלונות חופפים רק לאפסים ולחורים, ואילו אחרים חופפים לערכי קלט אמיתיים.

שלב 4) בכל חלון, הרכיבים משולבים באמצעות פונקציית הצמצום (a, b) → a + b, החל מערך התחלתי של 0. שני החלונות העליונים רואים רק ריפוד וחורים, ולכן התוצאות שלהם הן 0. החלונות התחתונים מציגים את הערכים 3 ו-4 מהקלט ומחזירים אותם כתוצאות.

תוצאות) הפלט הסופי הוא בצורה S32[2,2], עם הערכים: [[0,0],[3,4]]

Rem

מידע נוסף זמין במאמר בנושא XlaBuilder::Rem.

מבצעת שארית חלוקה של דיבידנד lhs ומחלק rhs לפי אלמנטים.

הסימן של התוצאה נלקח מהמחולק, והערך המוחלט של התוצאה תמיד קטן מהערך המוחלט של המחלק.

Rem(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור ממדים שונים עבור Rem:

Rem(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר בנושא StableHLO – שארית.

ReplicaId

מידע נוסף זמין במאמר בנושא XlaBuilder::ReplicaId.

מחזירה את המזהה הייחודי (סקלר U32) של העותק.

ReplicaId()

המזהה הייחודי של כל רפליקה הוא מספר שלם לא מסומן במרווח [0, N), כאשר N הוא מספר הרפליקות. מכיוון שכל העותקים הרצים מריצים את אותה תוכנית, קריאה של ReplicaId() בתוכנית תחזיר ערך שונה בכל עותק רץ.

מידע על StableHLO זמין במאמר בנושא StableHLO – replica_id.

עיצוב מחדש

מידע נוסף זמין במאמר בנושא XlaBuilder::Reshape. והפעולה Collapse.

משנה את הצורה של המערך לתצורה חדשה.

Reshape(operand, dimensions)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T
dimensions int64 וקטור ווקטור של גדלים של מאפיינים חדשים

מבחינה רעיונית, הפונקציה reshape משטחת קודם מערך לתוך וקטור חד-ממדי של ערכי נתונים, ואז משנה את הווקטור הזה לצורה חדשה. ארגומנטי הקלט הם מערך שרירותי מסוג T, וקטור קבוע בזמן הקומפילציה של אינדקסים של ממדים, ווקטור קבוע בזמן הקומפילציה של גדלים של ממדים לתוצאה. הווקטור dimensions קובע את הגודל של מערך הפלט. הערך באינדקס 0 ב-dimensions הוא הגודל של מאפיין 0, הערך באינדקס 1 הוא הגודל של מאפיין 1, וכן הלאה. המכפלה של המימדים dimensions חייבת להיות שווה למכפלה של גדלי המימדים של האופרנד. כשמצמצמים את המערך המכווץ למערך הרב-ממדי שמוגדר על ידי dimensions, המימדים ב-dimensions מסודרים מהמימד עם השינוי הכי איטי (הכי משמעותי) למימד עם השינוי הכי מהיר (הכי פחות משמעותי).

לדוגמה, נניח ש-v הוא מערך של 24 רכיבים:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
                    { {20, 21, 22}, {25, 26, 27} },
                    { {30, 31, 32}, {35, 36, 37} },
                    { {40, 41, 42}, {45, 46, 47} } };

let v012_24 = Reshape(v, {24});
then v012_24 == f32[24] {10, 11, 12, 15, 16, 17, 20, 21, 22, 25, 26, 27,
                         30, 31, 32, 35, 36, 37, 40, 41, 42, 45, 46, 47};

let v012_83 = Reshape(v, {8,3});
then v012_83 == f32[8x3] { {10, 11, 12}, {15, 16, 17},
                          {20, 21, 22}, {25, 26, 27},
                          {30, 31, 32}, {35, 36, 37},
                          {40, 41, 42}, {45, 46, 47} };

במקרה מיוחד, הפונקציה reshape יכולה להפוך מערך עם רכיב יחיד לערך סקלרי ולהפך. לדוגמה,

Reshape(f32[1x1] { {5} }, {}) == 5;
Reshape(5, {1,1}) == f32[1x1] { {5} };

מידע על StableHLO זמין במאמר בנושא StableHLO – reshape.

שינוי צורה (תוכן בוטה)

מידע נוסף זמין במאמר בנושא XlaBuilder::Reshape.

Reshape(shape, operand)

פעולת שינוי צורה שמשתמשת בצורת יעד מפורשת.

ארגומנטים סוג סמנטיקה
shape Shape צורת הפלט של סוג T
operand XlaOp מערך מסוג T

הפוך

מידע נוסף זמין במאמר בנושא XlaBuilder::Rev.

Rev(operand, dimensions)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T
dimensions ArraySlice<int64> מאפיינים להחלפה

הפונקציה הופכת את סדר הרכיבים במערך operand לאורך הציר dimensions שצוין, ויוצרת מערך פלט באותו הצורה. כל רכיב במערך האופרנד במדד רב-ממדי מאוחסן במערך הפלט במדד שעבר טרנספורמציה. האינדקס הרב-ממדי עובר טרנספורמציה על ידי היפוך האינדקס בכל ממד שצריך להפוך (כלומר, אם ממד בגודל N הוא אחד מהממדים שצריך להפוך, האינדקס שלו i עובר טרנספורמציה ל-N - 1 - i).

אחד השימושים בפעולה Rev הוא היפוך של מערך המשקלים של הקונבולוציה לאורך שני ממדי החלון במהלך חישוב הגרדיאנט ברשתות נוירונים.

מידע על StableHLO זמין במאמר בנושא StableHLO – reverse.

RngNormal

מידע נוסף זמין במאמר בנושא XlaBuilder::RngNormal.

יוצרת פלט בצורה נתונה עם מספרים אקראיים שנוצרו לפי \(N(\mu, \sigma)\) ההתפלגות הנורמלית. הפרמטרים \(\mu\) ו- \(\sigma\), וצורת הפלט צריכים להיות מסוג נקודה צפה. בנוסף, הפרמטרים צריכים להיות בעלי ערך סקלרי.

RngNormal(mu, sigma, shape)

ארגומנטים סוג סמנטיקה
mu XlaOp סקלר מסוג T שמציין את הממוצע של המספרים שנוצרו
sigma XlaOp סקלר מסוג T שמציין את סטיית התקן של
shape Shape צורת הפלט של סוג T

מידע על StableHLO זמין במאמר StableHLO - rng.

RngUniform

מידע נוסף זמין במאמר בנושא XlaBuilder::RngUniform.

יוצר פלט בצורה נתונה עם מספרים אקראיים שנוצרו לפי ההתפלגות האחידה במרווח \([a,b)\). הפרמטרים וסוג הרכיב של הפלט צריכים להיות מסוג בוליאני, מסוג של מספר שלם או מסוג של מספר עם נקודה עשרונית, והסוגים צריכים להיות עקביים. בשלב הזה, קצה העורף של המעבד ושל ה-GPU תומך רק ב-F64,‏ F32,‏ F16,‏ BF16,‏ S64,‏ U64,‏ S32 ו-U32. בנוסף, הפרמטרים צריכים להיות בעלי ערך סקלרי. אם \(b <= a\) התוצאה היא מוגדרת-הטמעה.

RngUniform(a, b, shape)

ארגומנטים סוג סמנטיקה
a XlaOp ערך סקלרי מסוג T שמציין את הגבול התחתון של המרווח
b XlaOp ערך סקלרי מסוג T שמציין את הגבול העליון של המרווח
shape Shape צורת הפלט של סוג T

מידע על StableHLO זמין במאמר StableHLO - rng.

RngBitGenerator

מידע נוסף זמין במאמר בנושא XlaBuilder::RngBitGenerator.

יוצר פלט עם צורה נתונה שממולאת בביטים אקראיים אחידים באמצעות האלגוריתם שצוין (או ברירת המחדל של העורף), ומחזיר מצב מעודכן (עם אותה צורה כמו המצב ההתחלתי) ואת הנתונים האקראיים שנוצרו.

המצב ההתחלתי הוא המצב ההתחלתי של יצירת המספר האקראי הנוכחית. הוא תלוי באלגוריתם שבו משתמשים, וגם בצורה הנדרשת ובערכים התקפים.

הפלט הוא פונקציה דטרמיניסטית של המצב ההתחלתי, אבל לא מובטח שהוא יהיה דטרמיניסטי בין קצה עורפי לבין גרסאות שונות של קומפיילר.

RngBitGenerator(algorithm, initial_state, shape)

ארגומנטים סוג סמנטיקה
algorithm RandomAlgorithm אלגוריתם PRNG שבו יש להשתמש.
initial_state XlaOp מצב התחלתי של אלגוריתם PRNG.
shape Shape צורת הפלט של הנתונים שנוצרו.

הערכים הזמינים של algorithm:

מידע על StableHLO זמין במאמר StableHLO – rng_bit_generator.

RngGetAndUpdateState

מידע נוסף זמין במאמר בנושא HloInstruction::CreateRngGetAndUpdateState.

ממשק ה-API של הפעולות השונות ב-Rng מפורק באופן פנימי להוראות HLO, כולל RngGetAndUpdateState.

RngGetAndUpdateState משמש כפרימיטיב ב-HLO. האופרטור הזה עשוי להופיע בקובצי dump של HLO, אבל הוא לא מיועד לבנייה ידנית על ידי משתמשי קצה.

עגול

מידע נוסף זמין במאמר בנושא XlaBuilder::Round.

עיגול לפי רכיבים, במקרה של שוויון המרחק מהאפס.

Round(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

RoundNearestAfz

מידע נוסף זמין במאמר בנושא XlaBuilder::RoundNearestAfz.

הפונקציה מבצעת עיגול של כל רכיב למספר השלם הקרוב ביותר, והיא מעגלת מספרים שחציון שלהם הוא 0 לכיוון ההפוך מאפס.

RoundNearestAfz(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר בנושא StableHLO – round_nearest_afz.

RoundNearestEven

מידע נוסף זמין במאמר בנושא XlaBuilder::RoundNearestEven.

עיגול לפי רכיבים, במקרה של שוויון מעגלים למספר הזוגי הקרוב ביותר.

RoundNearestEven(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר StableHLO - round_nearest_even.

Rsqrt

מידע נוסף זמין במאמר בנושא XlaBuilder::Rsqrt.

ההופכי של השורש הריבועי של כל רכיב בנפרד, x -> 1.0 / sqrt(x).

Rsqrt(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Rsqrt תומכת גם בארגומנט האופציונלי result_accuracy:

Rsqrt(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO – rsqrt.

סריקה

מידע נוסף זמין במאמר בנושא XlaBuilder::Scan.

הפונקציה מחילה פונקציית צמצום על מערך לאורך ממד נתון, ומייצרת מצב סופי ומערך של ערכי ביניים.

Scan(inputs..., inits..., to_apply, scan_dimension, is_reverse, is_associative)

ארגומנטים סוג סמנטיקה
inputs רצף של m XlaOp המערכים שייסרקו.
inits רצף של k XlaOp העברות ראשוניות.
to_apply XlaComputation חישוב מסוג i_0, ..., i_{m-1}, c_0, ..., c_{k-1} -> (o_0, ..., o_{n-1}, c'_0, ..., c'_{k-1}).
scan_dimension int64 המאפיין שצריך לסרוק.
is_reverse bool אם הערך הוא true, הסריקה מתבצעת בסדר הפוך.
is_associative bool (שלושה מצבים) אם הערך הוא true, הפעולה היא אסוציאטיבית.

הפונקציה to_apply מוחלת באופן עקבי על רכיבים ב-inputs לאורך scan_dimension. אם הערך של is_reverse הוא false, הרכיבים מעובדים לפי הסדר 0 עד N-1, כאשר N הוא הגודל של scan_dimension. אם הערך של is_reverse הוא true, הרכיבים מעובדים מ-N-1 עד 0.

הפונקציה to_apply מקבלת m + k אופרנדים:

  1. m אלמנטים נוכחיים מתוך inputs.
  2. k ערכי הנשיאה מהשלב הקודם (או inits עבור הרכיב הראשון).

הפונקציה to_apply מחזירה טאפל של n + k ערכים:

  1. רכיבי n של outputs.
  2. k ערכים חדשים של העברה.

פעולת הסריקה יוצרת טאפל של n + k ערכים:

  1. מערכי הפלט n, שמכילים את ערכי הפלט לכל שלב.
  2. הערכים הסופיים של k הם הערכים שמתקבלים אחרי עיבוד כל הרכיבים.

הסוגים של הקלט m צריכים להיות זהים לסוגים של הפרמטרים הראשונים m של to_apply עם מאפיין סריקה נוסף. הסוגים של הפלטים של n צריכים להיות זהים לסוגים של ערכי ההחזרה הראשונים של to_apply עם מימד סריקה נוסף.n הגודל של המימד הנוסף בסריקה צריך להיות זהה N בכל הקלט והפלט. הסוגים של הפרמטרים האחרונים k וערכי ההחזרה של to_apply וגם של k init צריכים להיות זהים.

לדוגמה (m, n, k == 1, N == 3), כדי להעביר את הערך הראשוני i, מזינים [a, b, c], פונקציה f(x, c) -> (y, c') ו-scan_dimension=0, is_reverse=false:

  • שלב 0: f(a, i) -> (y0, c0)
  • שלב 1: f(b, c0) -> (y1, c1)
  • שלב 2: f(c, c1) -> (y2, c2)

הפלט של Scan הוא ([y0, y1, y2], c2).

פיזור

מידע נוסף זמין במאמר בנושא XlaBuilder::Scatter.

פעולת הפיזור של XLA יוצרת רצף של תוצאות שהן הערכים של מערך הקלט operands, עם כמה פרוסות (באינדקסים שצוינו על ידי scatter_indices) שמעודכנות ברצף הערכים ב-updates באמצעות update_computation.

Scatter(operands..., scatter_indices, updates..., update_computation, dimension_numbers, indices_are_sorted, unique_indices)

ארגומנטים סוג סמנטיקה
operands רצף של N XlaOp ‫N מערכים מסוג T_0, ..., T_N לפיזור.
scatter_indices XlaOp מערך שמכיל את אינדקס ההתחלה של הפרוסות שצריך לפזר.
updates רצף של N XlaOp ‫N מערכים מסוג T_0, ..., T_N. ‫updates[i] מכיל את הערכים שצריך להשתמש בהם לפיזור operands[i].
update_computation XlaComputation חישוב שישמש לשילוב הערכים הקיימים במערך הקלט והעדכונים במהלך הפיזור. החישוב הזה צריך להיות מסוג T_0, ..., T_N, T_0, ..., T_N -> Collate(T_0, ..., T_N).
index_vector_dim int64 המאפיין ב-scatter_indices שמכיל את האינדקסים ההתחלתיים.
update_window_dims ArraySlice<int64> קבוצת המאפיינים בצורה updates שהם מאפייני חלון.
inserted_window_dims ArraySlice<int64> קבוצת מידות החלון שצריך להוסיף לצורה updates.
scatter_dims_to_operand_dims ArraySlice<int64> מיפוי של המאפיינים ממדדי הפיזור למרחב של מדדי האופרנד. המערך הזה מתפרש כמיפוי של i ל-scatter_dims_to_operand_dims[i] . המיפוי צריך להיות מלא וחד-חד-ערכי.
dimension_number ScatterDimensionNumbers מספרי מאפיינים לפעולת פיזור
indices_are_sorted bool הארגומנט שקובע אם המדדים ממוינים על ידי הפונקציה שקוראת לפונקציה הנוכחית.
unique_indices bool האם המדדים מובטחים להיות ייחודיים על ידי המתקשר.

כאשר:

  • הערך של n חייב להיות גדול מ-1 או שווה לו.
  • כל המאפיינים operands[0], ..., operands[N-1] חייבים להיות באותן מידות.
  • כל המאפיינים updates[0], ..., updates[N-1] חייבים להיות באותן מידות.
  • אם N = 1, אז Collate(T) הוא T.
  • אם N > 1, Collate(T_0, ..., T_N) הוא טאפל של רכיבי N מסוג T.

אם index_vector_dim שווה ל-scatter_indices.rank, אנחנו מניחים באופן מרומז של-scatter_indices יש מאפיין 1 בסוף.

אנחנו מגדירים את update_scatter_dims מסוג ArraySlice<int64> כקבוצת המאפיינים של הצורה updates שלא נמצאים ב-update_window_dims, בסדר עולה.

הארגומנטים של scatter צריכים לעמוד במגבלות הבאות:

  • לכל מערך updates צריכות להיות update_window_dims.size + scatter_indices.rank - 1 מידות.

  • הגבולות של מאפיין i בכל מערך updates צריכים להיות בהתאם לדרישות הבאות:

    • אם i מופיע ב-update_window_dims (כלומר, שווה ל-update_window_dims[k] עבור k מסוים), אז הגבול של המאפיין i ב-updates לא יכול להיות גדול מהגבול התואם של operand אחרי שמתחשבים ב-inserted_window_dims (כלומר, adjusted_window_bounds[k], כאשר adjusted_window_bounds מכיל את הגבולות של operand עם הגבולות במדדים inserted_window_dims שהוסרו).
    • אם i מופיע ב-update_scatter_dims (כלומר, שווה ל-update_scatter_dims[k] עבור ערך מסוים של k), אז הגבול של המימד i ב-updates חייב להיות שווה לגבול המתאים של scatter_indices, תוך דילוג על index_vector_dim (כלומר, scatter_indices.shape.dims[k], אם k < index_vector_dim, ו-scatter_indices.shape.dims[k+1] אחרת).
  • המספרים update_window_dims צריכים להיות בסדר עולה, לא יכולים להיות מספרי מאפיינים חוזרים, והם צריכים להיות בטווח [0, updates.rank).

  • המספרים inserted_window_dims צריכים להיות בסדר עולה, לא יכולים להיות מספרי מאפיינים חוזרים, והם צריכים להיות בטווח [0, operand.rank).

  • הערך של operand.rank חייב להיות שווה לסכום של update_window_dims.size ושל inserted_window_dims.size.

  • הערך של scatter_dims_to_operand_dims.size צריך להיות שווה לערך של scatter_indices.shape.dims[index_vector_dim], והערכים שלו צריכים להיות בטווח [0, operand.rank).

לכל אינדקס U במערך updates, האינדקס התואם I במערך operands שאליו צריך להחיל את העדכון הזה מחושב באופן הבא:

  1. ‫Let G = { U[k] for k in update_scatter_dims }. Use G to look up an index vector S in the scatter_indices array such that S[i] = scatter_indices[Combine(G, i)] where Combine(A, b) inserts b at positions index_vector_dim into A.
  2. תצור אינדקס Sin ב-operand באמצעות S על ידי פיזור S באמצעות המפה scatter_dims_to_operand_dims. בצורה רשמית יותר:
    1. Sin[scatter_dims_to_operand_dims[k]] = S[k] if k < scatter_dims_to_operand_dims.size.
    2. Sin[_] = 0 אחרת.
  3. יוצרים אינדקס Win לכל מערך operands על ידי פיזור האינדקסים ב-update_window_dims ב-U בהתאם ל-inserted_window_dims. בצורה רשמית יותר:
    1. Win[window_dims_to_operand_dims(k)] = U[k] if k is in update_window_dims, where window_dims_to_operand_dims is the monotonic function with domain [0, update_window_dims.size) and range [0, operand.rank) \ inserted_window_dims. (לדוגמה, אם update_window_dims.size הוא 4, ‏ operand.rank הוא 6 ו-inserted_window_dims הוא {0, 2}, אז window_dims_to_operand_dims הוא {01, 13, 24, 35}).
    2. Win[_] = 0 אחרת.
  4. I הוא Win + Sin כאשר + הוא חיבור של כל רכיב בנפרד.

לסיכום, אפשר להגדיר את פעולת הפיזור באופן הבא.

  • מאתחלים את output עם operands, כלומר לכל האינדקסים J, לכל האינדקסים O במערך operands[J]:
    output[J][O] = operands[J][O]
  • לכל אינדקס U במערך updates[J] ולאינדקס התואם O במערך operand[J], אם O הוא אינדקס תקין עבור output:
    (output[0][O], ..., output[N-1][O]) =update_computation(output[0][O], ..., ,output[N-1][O],updates[0][U], ...,updates[N-1][U])

סדר העדכונים לא קבוע. לכן, אם כמה אינדקסים ב-updates מפנים לאותו אינדקס ב-operands, הערך התואם ב-output יהיה לא דטרמיניסטי.

שימו לב שהפרמטר הראשון שמועבר אל update_computation תמיד יהיה הערך הנוכחי מהמערך output, והפרמטר השני תמיד יהיה הערך מהמערך updates. זה חשוב במיוחד במקרים שבהם update_computation הוא לא קומוטטיבי.

אם המדיניות indices_are_sorted מוגדרת כ-True,‏ XLA יכול להניח שהמשתמש מיין את scatter_indices (בסדר עולה, אחרי פיזור הערכים לפי scatter_dims_to_operand_dims). אם הם לא כאלה, הסמנטיקה מוגדרת על ידי ההטמעה.

אם הערך של unique_indices הוא true,‏ XLA יכול להניח שכל האלמנטים שמועברים הם ייחודיים. לכן, יכול להיות ש-XLA ישתמש בפעולות לא אטומיות. אם הערך של unique_indices הוא true והאינדקסים שמועברים אליהם לא ייחודיים, הסמנטיקה מוגדרת בהטמעה.

באופן לא רשמי, אפשר לראות את פעולת הפיזור כהיפוך של פעולת האיסוף, כלומר, פעולת הפיזור מעדכנת את הרכיבים בקלט שמחולצים על ידי פעולת האיסוף התואמת.

תיאור לא רשמי מפורט ודוגמאות זמינים בקטע 'תיאור לא רשמי' במאמר Gather.

מידע על StableHLO זמין במאמר StableHLO – scatter.

‫Scatter – דוגמה 1 – StableHLO

דוגמה לזרימת נתונים של Scatter עבור StableHLO

בתמונה שלמעלה, כל שורה בטבלה היא דוגמה לעדכון של אינדקס. בואו נבדוק את התהליך משמאל(עדכון האינדקס) לימין(תוצאת האינדקס):

הקלט) input הוא בצורה S32[2,3,4,2]. ‫scatter_indices have shape S64[2,2,3,2]. ‫updates יש צורה S32[2,2,3,1,2].

עדכון האינדקס) כחלק מהקלט שקיבלנו update_window_dims:[3,4]. השורה הזו מציינת שהמאפיינים dim 3 ו-dim 4 של updates הם מידות החלון, והם מסומנים בצהוב. כך אנחנו יכולים להסיק ש-update_scatter_dims = [0,1,2].

עדכון מדד הפיזור) מוצגות לנו התוצאות שחולצו updated_scatter_dims לכל אחת מהן. (החלק שלא צבוע בצהוב בעמודה Update Index)

אינדקס התחלה) אם נסתכל על תמונת הטנסור scatter_indices, נוכל לראות שהערכים מהשלב הקודם (עדכון אינדקס הפיזור) מציינים את המיקום של אינדקס ההתחלה. מ-index_vector_dim אנחנו גם מקבלים את המימד של starting_indices שמכיל את אינדקס ההתחלה, שהוא 3 עם גודל 2 עבור scatter_indices.

‫Full Start Index) scatter_dims_to_operand_dims = [2,1] ‎ אומר לנו שהרכיב הראשון של וקטור האינדקס עובר לאופרנד dim 2. האלמנט השני של וקטור האינדקס עובר לממד 1 של האופרנד. המאפיינים הנותרים של האופרנד ימולאו ב-0.

מדד אצווה מלא) אפשר לראות שהאזור הסגול המודגש מוצג בעמודה הזו(מדד אצווה מלא), בעמודת מדד פיזור העדכון ובעמודת מדד העדכון.

אינדקס המסך המלא) מחושב מתוך update_window_dimensions [3,4].

אינדקס התוצאה) סכום של אינדקס ההתחלה המלא, אינדקס האצווה המלא ואינדקס החלון המלא בטנזור operand. שימו לב שהאזורים שמודגשים בירוק תואמים גם לנתונים בoperand. השורה האחרונה מושמטת כי היא לא נכללת בטנזור operand.

בחירה

מידע נוסף זמין במאמר בנושא XlaBuilder::Select.

הפונקציה יוצרת מערך פלט מתוך רכיבים של שני מערכי קלט, על סמך הערכים של מערך פרדיקטים.

Select(pred, on_true, on_false)

ארגומנטים סוג סמנטיקה
pred XlaOp מערך מסוג PRED
on_true XlaOp מערך מסוג T
on_false XlaOp מערך מסוג T

למערכים on_true ו-on_false צריך להיות אותו מבנה. זה גם הצורה של מערך הפלט. למערך pred חייב להיות אותו מספר ממדים כמו למערכים on_true ו-on_false, עם סוג הרכיב PRED.

לכל אלמנט P ב-pred, האלמנט התואם במערך הפלט נלקח מ-on_true אם הערך של P הוא true, ומ-on_false אם הערך של P הוא false. pred יכול להיות סקלר מסוג PRED, כצורה מוגבלת של שידור. במקרה הזה, מערך הפלט נלקח כולו מ-on_true אם pred הוא true, ומ-on_false אם pred הוא false.

דוגמה עם ערך לא סקלרי pred:

let pred: PRED[4] = {true, false, false, true};
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 200, 300, 4};

דוגמה עם סקלר pred:

let pred: PRED = true;
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 2, 3, 4};

יש תמיכה בבחירות בין טאפלים. למטרה הזו, טאפלים נחשבים לסוגים סקלריים. אם on_true ו-on_false הם טאפלים (שחייבים להיות באותו הצורה!), אז pred חייב להיות סקלר מסוג PRED.

מידע על StableHLO זמין במאמר StableHLO - select

SelectAndScatter

מידע נוסף זמין במאמר בנושא XlaBuilder::SelectAndScatter.

אפשר להתייחס לפעולה הזו כאל פעולה מורכבת שמחשבת קודם את ReduceWindow במערך operand כדי לבחור רכיב מכל חלון, ואז מפזרת את מערך source לאינדקסים של הרכיבים שנבחרו כדי ליצור מערך פלט עם אותה צורה כמו מערך האופרנד. הפונקציה הבינארית select משמשת לבחירת רכיב מכל חלון על ידי החלתה על כל חלון, והיא מופעלת עם המאפיין שבו וקטור האינדקס של הפרמטר הראשון קטן לקסיקוגרפית מווקטור האינדקס של הפרמטר השני. הפונקציה select מחזירה true אם הפרמטר הראשון נבחר, ומחזירה false אם הפרמטר השני נבחר. הפונקציה צריכה להיות טרנזיטיבית (כלומר, אם select(a, b) ו-select(b, c) הם true, אז גם select(a, c) הוא true), כדי שהרכיב שנבחר לא יהיה תלוי בסדר של הרכיבים שמועברים בחלון נתון.

הפונקציה scatter מוחלת על כל אינדקס שנבחר במערך הפלט. היא מקבלת שני פרמטרים סקלריים:

  1. הערך הנוכחי באינדקס שנבחר במערך הפלט
  2. ערך הפיזור מ-source שחל על האינדקס שנבחר

הפונקציה משלבת את שני הפרמטרים ומחזירה ערך סקלרי שמשמש לעדכון הערך באינדקס שנבחר במערך הפלט. בהתחלה, כל האינדקסים של מערך הפלט מוגדרים ל-init_value.

למערך הפלט יש את אותו הצורה כמו למערך operand, ולמערך source צריכה להיות אותה צורה כמו לתוצאה של הפעלת פעולה ReduceWindow על המערך operand. אפשר להשתמש ב-SelectAndScatter כדי להעביר לאחור את ערכי הגרדיאנט לשכבת איגום ברשת עצבית.

SelectAndScatter(operand, select, window_dimensions, window_strides, padding, source, init_value, scatter)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך מסוג T שחלונות הזמן נעים לאורכו
select XlaComputation חישוב בינארי מהסוג T, T -> PRED, שחל על כל האלמנטים בכל חלון. הפונקציה מחזירה true אם הפרמטר הראשון נבחר, ומחזירה false אם הפרמטר השני נבחר.
window_dimensions ArraySlice<int64> מערך של מספרים שלמים לערכי מאפייני חלון
window_strides ArraySlice<int64> מערך של מספרים שלמים לערכי הצעד של החלון
padding Padding סוג הריפוד של החלון (Padding::kSame או Padding::kValid)
source XlaOp מערך מסוג T עם הערכים לפיזור
init_value XlaOp ערך סקלרי מסוג T לערך ההתחלתי של מערך הפלט
scatter XlaComputation חישוב בינארי מסוג T, T -> T, כדי להחיל כל רכיב של מקור הפיזור עם רכיב היעד שלו

באיור הבא מוצגות דוגמאות לשימוש בפונקציה SelectAndScatter, כאשר הפונקציה select מחשבת את הערך המקסימלי מבין הפרמטרים שלה. שימו לב: כשהחלונות חופפים, כמו באיור (2) שלמטה, יכול להיות שאינדקס של מערך operand ייבחר כמה פעמים על ידי חלונות שונים. באיור, הרכיב עם הערך 9 נבחר על ידי שני החלונות העליונים (הכחול והאדום), והפונקציה של החיבור הבינארי scatter יוצרת את רכיב הפלט עם הערך 8 (2 + 6).

סדר החישוב של הפונקציה scatter הוא שרירותי ולא דטרמיניסטי. לכן, הפונקציה scatter לא צריכה להיות רגישה מדי לשיוך מחדש. פרטים נוספים מופיעים בדיון על אסוציאטיביות בהקשר של Reduce.

מידע על StableHLO זמין במאמר בנושא StableHLO – select_and_scatter.

שליחה

מידע נוסף זמין במאמר בנושא XlaBuilder::Send.

Send,‏ SendWithTokens ו-SendToHost הם פעולות שמשמשות כפרימיטיבים של תקשורת ב-HLO. הפעולות האלה מופיעות בדרך כלל בפריקות של HLO כחלק מהעברת קלט/פלט ברמה נמוכה או העברה בין מכשירים, אבל הן לא מיועדות לבנייה ידנית על ידי משתמשי קצה.

Send(operand, handle)

ארגומנטים סוג סמנטיקה
operand XlaOp הנתונים לשליחה (מערך מסוג T)
handle ChannelHandle מזהה ייחודי לכל זוג של שליחה/קבלה

שולחת את נתוני האופרנד שצוינו להוראה Recv בחישוב אחר שמשתמש באותו שם ערוץ. לא מוחזרים נתונים.

בדומה לפעולה Recv, ממשק ה-API של הלקוח של הפעולה Send מייצג תקשורת סינכרונית, והוא מפורק באופן פנימי ל-2 הוראות HLO ‏ (Send ו-SendDone) כדי לאפשר העברות נתונים אסינכרוניות. ראו גם HloInstruction::CreateSend ו-HloInstruction::CreateSendDone.

Send(HloInstruction operand, int64 channel_id)

מתחילה העברה אסינכרונית של האופרנד למשאבים שהוקצו על ידי ההוראה Recv עם אותו מזהה ערוץ. הפונקציה מחזירה הקשר, שמשמש את ההוראה הבאה SendDone להמתנה להשלמת העברת הנתונים. ההקשר הוא טאפל של {אופרנד (צורה), מזהה בקשה (U32)} ואפשר להשתמש בו רק בהוראה SendDone.

מידע על StableHLO זמין במאמר בנושא StableHLO – send.

SendDone

מידע נוסף זמין במאמר בנושא HloInstruction::CreateSendDone.

SendDone(HloInstruction context)

בהינתן הקשר שנוצר על ידי הוראה Send, המערכת ממתינה לסיום העברת הנתונים. ההוראה לא מחזירה נתונים.

תזמון של הוראות בערוץ

סדר הביצוע של 4 ההוראות לכל ערוץ (Recv, RecvDone, Send, SendDone) הוא כמו שמופיע בהמשך.

  • Recv לפני Send
  • Send לפני RecvDone
  • Recv לפני RecvDone
  • Send לפני SendDone

כשמהדרים של העורף יוצרים תזמון לינארי לכל חישוב שמתבצע באמצעות הוראות לערוץ, לא יכולים להיות מחזורים בחישובים. לדוגמה, התזמונים הבאים מובילים לקיפאון.

SetDimensionSize

מידע נוסף זמין במאמר בנושא XlaBuilder::SetDimensionSize.

הפעולה מגדירה את הגודל הדינמי של המימד שצוין ב-XlaOp. האופרנד חייב להיות בצורת מערך.

SetDimensionSize(operand, val, dimension)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך קלט n-ממדי.
val XlaOp ‫int32 שמייצג את הגודל הדינמי של זמן הריצה.
dimension int64 ערך במרווח [0, n) שמציין את המאפיין.

הפונקציה מעבירה את האופרנד כתוצאה, עם מאפיין דינמי שמתבצע אחריו מעקב על ידי הקומפיילר.

המערכת תתעלם מערכים עם ריווח בפעולות צמצום בהמשך.

let v: f32[10] = f32[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
let five: s32 = 5;
let six: s32 = 6;

// Setting dynamic dimension size doesn't change the upper bound of the static
// shape.
let padded_v_five: f32[10] = set_dimension_size(v, five, /*dimension=*/0);
let padded_v_six: f32[10] = set_dimension_size(v, six, /*dimension=*/0);

// sum == 1 + 2 + 3 + 4 + 5
let sum:f32[] = reduce_sum(padded_v_five);
// product == 1 * 2 * 3 * 4 * 5
let product:f32[] = reduce_product(padded_v_five);

// Changing padding size will yield different result.
// sum == 1 + 2 + 3 + 4 + 5 + 6
let sum:f32[] = reduce_sum(padded_v_six);

ShiftLeft

מידע נוסף זמין במאמר בנושא XlaBuilder::ShiftLeft.

מבצעת פעולת הזזה שמאלה לפי רכיב ב-lhs לפי מספר הסיביות rhs.

ShiftLeft(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהעברה בשידור עם ממדים שונים ל-ShiftLeft:

ShiftLeft(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO - shift_left.

ShiftRightArithmetic

מידע נוסף זמין במאמר בנושא XlaBuilder::ShiftRightArithmetic.

מבצעת פעולת הזזה אריתמטית ימינה ברמת הרכיב ב-lhs במספר rhs של סיביות.

ShiftRightArithmetic(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהעברה בשידור עם ממדים שונים עבור ShiftRightArithmetic:

ShiftRightArithmetic(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO - shift_right_arithmetic.

ShiftRightLogical

מידע נוסף זמין במאמר בנושא XlaBuilder::ShiftRightLogical.

מבצעת פעולת הזזה לוגית ימינה ברמת הרכיב ב-lhs במספר rhs של סיביות.

ShiftRightLogical(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בהעברה רחבה של מימדים שונים עבור ShiftRightLogical:

ShiftRightLogical(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO - shift_right_logical.

לחתימה

מידע נוסף זמין במאמר בנושא XlaBuilder::Sign.

Sign(operand) פעולת חתימה לפי רכיב x -> sgn(x) כאשר

\[\text{sgn}(x) = \begin{cases} -1 & x < 0\\ -0 & x = -0\\ NaN & x = NaN\\ +0 & x = +0\\ 1 & x > 0 \end{cases}\]

באמצעות אופרטור ההשוואה של סוג הרכיב operand.

Sign(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

מידע על StableHLO זמין במאמר בנושא StableHLO – sign.

חטא

Sin(operand) Element-wise sine x -> sin(x).

מידע נוסף זמין במאמר בנושא XlaBuilder::Sin.

Sin(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Sin תומכת גם בארגומנט האופציונלי result_accuracy:

Sin(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO - sine.

תבנית של תוכן דינמי

מידע נוסף זמין במאמר בנושא XlaBuilder::Slice.

הפונקציה Slicing מחלצת תת-מערך ממערך הקלט. למערך המשנה יש אותו מספר ממדים כמו לקלט, והוא מכיל את הערכים בתוך תיבת תוחמת במערך הקלט, כאשר הממדים והאינדקסים של התיבה התוחמת ניתנים כארגומנטים לפעולת החיתוך.

Slice(operand, start_indices, limit_indices, strides)

ארגומנטים סוג סמנטיקה
operand XlaOp מערך N ממדי מסוג T
start_indices ArraySlice<int64> רשימה של N מספרים שלמים שמכילה את האינדקסים ההתחלתיים של הפרוסה לכל מימד. הערכים חייבים להיות גדולים מ-0 או שווים ל-0.
limit_indices ArraySlice<int64> רשימה של N מספרים שלמים שמכילים את האינדקסים של סוף הפרוסה (לא כולל) לכל מאפיין. כל ערך צריך להיות גדול מהערך המתאים של start_indices במאפיין או שווה לו, וקטן מגודל המאפיין או שווה לו.
strides ArraySlice<int64> רשימה של N מספרים שלמים שקובעת את קפיצת הקלט של הפרוסה. הפונקציה slice בוחרת כל רכיב strides[d] במאפיין d.

דוגמה חד-ממדית:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
Slice(a, {2}, {4})
// Result: {2.0, 3.0}

דוגמה דו-ממדית:

let b =
 { {0.0,  1.0,  2.0},
   {3.0,  4.0,  5.0},
   {6.0,  7.0,  8.0},
   {9.0, 10.0, 11.0} }

Slice(b, {2, 1}, {4, 3})
// Result:
//   { { 7.0,  8.0},
//     {10.0, 11.0} }

מידע על StableHLO זמין במאמר StableHLO - slice.

מיון

מידע נוסף זמין במאמר בנושא XlaBuilder::Sort.

Sort(operands, comparator, dimension, is_stable)

ארגומנטים סוג סמנטיקה
operands ArraySlice<XlaOp> האופרנדים למיון.
comparator XlaComputation החישוב של ההשוואה שבו רוצים להשתמש.
dimension int64 המאפיין שלפיו רוצים למיין.
is_stable bool מציינת אם להשתמש במיון יציב.

אם מציינים רק אופרנד אחד:

  • אם האופרנד הוא טנזור חד-ממדי (מערך), התוצאה היא מערך ממוין. אם רוצים למיין את המערך בסדר עולה, פונקציית ההשוואה צריכה לבצע השוואה של 'קטן מ'. באופן רשמי, אחרי המיון של המערך, מתקיים לכל מיקומי האינדקס i, j עם i < j אחד מהתנאים הבאים: comparator(value[i], value[j]) = comparator(value[j], value[i]) = false או comparator(value[i], value[j]) = true.

  • אם לאופרנד יש מספר גבוה יותר של מאפיינים, האופרנד ממוין לאורך המאפיין שצוין. לדוגמה, עבור טנזור דו-ממדי (מטריצה), ערך המאפיין 0 ימיין באופן עצמאי כל עמודה, וערך המאפיין 1 ימיין באופן עצמאי כל שורה. אם לא מציינים מספר מאפיין, המערכת בוחרת כברירת מחדל את המאפיין האחרון. למאפיין שממוין, חל אותו סדר מיון כמו במקרה של מימד אחד.

אם מספקים אופרנדים של n > 1:

  • כל האופרנדים של n צריכים להיות טנסורים עם אותם ממדים. יכול להיות שסוגי הרכיבים של הטנסורים יהיו שונים.

  • כל האופרנדים ממוינים יחד, ולא בנפרד. מבחינה מושגית, האופרנדים נחשבים לטופל. כשבודקים אם צריך להחליף בין הרכיבים של כל אופרנד במיקומי האינדקס i ו-j, מתבצעת קריאה לפונקציית ההשוואה עם 2 * n פרמטרים סקלריים, כאשר הפרמטר 2 * k תואם לערך במיקום i מהאופרנד k-th, והפרמטר 2 * k + 1 תואם לערך במיקום j מהאופרנד k-th. בדרך כלל, פעולת ההשוואה תתבצע בין הפרמטרים 2 * k ו-2 * k + 1, ואולי גם בין זוגות אחרים של פרמטרים כדי להכריע במקרה של שוויון.

  • התוצאה היא טופל שמורכב מהאופרנדים בסדר ממוין (לאורך המאפיין שצוין, כמו בדוגמה שלמעלה). האופרנד i-th של ה-tuple תואם לאופרנד i-th של Sort.

לדוגמה, אם יש שלושה אופרנדים operand0 = [3, 1],‏ operand1 = [42, 50], ‏ operand2 = [-3.0, 1.1], והפונקציה להשוואה משווה רק את הערכים של operand0 עם האופרטור 'קטן מ', הפלט של המיון הוא ה-tuple‏ ([1, 3], [50, 42], [1.1, -3.0]).

אם הערך של is_stable הוא true, המיון יציב. כלומר, אם יש רכיבים שנחשבים שווים על ידי פונקציית ההשוואה, הסדר היחסי של הערכים השווים נשמר. שני אלמנטים e1 ו-e2 שווים אם ורק אם comparator(e1, e2) = comparator(e2, e1) = false. כברירת מחדל, is_stable מוגדר כ-false.

מידע על StableHLO זמין במאמר בנושא StableHLO – sort.

Sqrt

מידע נוסף זמין במאמר בנושא XlaBuilder::Sqrt.

פעולת שורש ריבועי לפי רכיב x -> sqrt(x).

Sqrt(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Sqrt תומכת גם בארגומנט האופציונלי result_accuracy:

Sqrt(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר בנושא StableHLO – sqrt.

תת-נכס

מידע נוסף זמין במאמר בנושא XlaBuilder::Sub.

מבצעת חיסור של lhs ו-rhs לפי אלמנטים.

Sub(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור בממדים שונים עבור Sub:

Sub(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר בנושא StableHLO – subtract.

חום צהבהב

מידע נוסף זמין במאמר בנושא XlaBuilder::Tan.

טנגנס של כל רכיב x -> tan(x).

Tan(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Tan תומכת גם בארגומנט האופציונלי result_accuracy:

Tan(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

מידע על StableHLO זמין במאמר StableHLO - tan.

Tanh

מידע נוסף זמין במאמר בנושא XlaBuilder::Tanh.

טנגנס היפרבולי של כל רכיב x -> tanh(x).

Tanh(operand)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה

הפונקציה Tanh תומכת גם בארגומנט האופציונלי result_accuracy:

Tanh(operand, result_accuracy)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד של הפונקציה
result_accuracy אופציונלי ResultAccuracy סוגי הדיוק שהמשתמש יכול לבקש עבור פעולות אונריות עם כמה הטמעות

מידע נוסף על result_accuracy זמין במאמר דיוק התוצאות.

למידע על StableHLO, ראו StableHLO – tanh.

TopK

מידע נוסף זמין במאמר בנושא XlaBuilder::TopK.

TopK מוצאת את הערכים והאינדקסים של k הרכיבים הגדולים או הקטנים ביותר בממד האחרון של הטנזור הנתון.

TopK(operand, k, largest)

ארגומנטים סוג סמנטיקה
operand XlaOp הטנזור שממנו יש לחלץ את k הרכיבים העליונים. ל-Tensor חייבים להיות לפחות מימד אחד. הגודל של המימד האחרון של הטנזור חייב להיות גדול מ-k או שווה לו.
k int64 מספר הרכיבים לחילוץ.
largest bool האם לחלץ את k הרכיבים הגדולים או הקטנים ביותר.

עבור טנסור קלט חד-ממדי (מערך), הפונקציה מוצאת את k הערכים הגדולים או הקטנים ביותר במערך ומחזירה טאפל של שני מערכים (values, indices). לכן, values[j] הוא הערך ה-j בגודל או בקטן ביותר ב-operand, והאינדקס שלו הוא indices[j].

עבור טנסור קלט עם יותר ממימד אחד, הפונקציה מחשבת את k הרשומות המובילות לאורך המימד האחרון, ושומרת את כל המימדים האחרים (שורות) בפלט. לכן, עבור אופרנד בצורה [A, B, ..., P, Q] כאשר Q >= k הפלט הוא טאפל (values, indices) כאשר:

values.shape = indices.shape = [A, B, ..., P, k]

אם שני אלמנטים בשורה שווים, האלמנט עם האינדקס הנמוך יותר מופיע ראשון.

החלפה

כדאי לעיין גם בפעולה tf.reshape.

Transpose(operand, permutation)

ארגומנטים סוג סמנטיקה
operand XlaOp האופרנד שצריך לשנות את המיקום שלו.
permutation ArraySlice<int64> איך מבצעים פרמוטציה של המאפיינים.

מבצעת פרמוטציה של המאפיינים של האופרנד עם הפרמוטציה שצוינה, כך שמתקבל ∀ i . 0 ≤ i < number of dimensions ⇒ input_dimensions[permutation[i]] = output_dimensions[i].

הפונקציה הזו זהה לפונקציה Reshape(operand, permutation, Permute(permutation, operand.shape.dimensions)).

מידע על StableHLO זמין במאמר StableHLO – transpose.

TriangularSolve

מידע נוסף זמין במאמר בנושא XlaBuilder::TriangularSolve.

פותר מערכות של משוואות ליניאריות עם מטריצות מקדמים משולשות עליונות או תחתונות באמצעות החלפה קדימה או אחורה. השגרה הזו משדרת לאורך הממדים המובילים, ופותרת אחת ממערכות המטריצות op(a) * x = b או x * op(a) = b עבור המשתנה x, בהינתן a ו-b, כאשר op(a) הוא op(a) = a, או op(a) = Transpose(a), או op(a) = Conj(Transpose(a)).

TriangularSolve(a, b, left_side, lower, unit_diagonal, transpose_a)

ארגומנטים סוג סמנטיקה
a XlaOp מערך דו-ממדי של מספרים מרוכבים או מספרים עם נקודה צפה, עם צורה [..., M, M].
b XlaOp ‫a > מערך דו-ממדי מאותו סוג עם צורה [..., M, K] אם left_side הוא true, אחרת [..., K, M].
left_side bool מציין אם לפתור מערכת מהצורה op(a) * x = b (true) או x * op(a) = b (false).
lower bool אם להשתמש במשולש העליון או התחתון של a.
unit_diagonal bool אם true, הרכיבים האלכסוניים של a הם 1 ולא מתבצעת אליהם גישה.
transpose_a Transpose האם להשתמש ב-a כמו שהוא, לבצע לו טרנספוזיציה או לקחת את הטרנספוזיציה הצמודה שלו.

נתוני הקלט נקראים רק מהמשולש התחתון או העליון של a, בהתאם לערך של lower. המערכת מתעלמת מהערכים מהמשולש השני. נתוני הפלט מוחזרים באותו המשולש. הערכים במשולש השני מוגדרים בהטמעה ויכולים להיות כל דבר.

אם מספר המימדים של a ו-b גדול מ-2, המערכת מתייחסת אליהם כאל קבוצות של מטריצות, שבהן כל המימדים מלבד 2 המימדים המשניים הם מימדי קבוצה. המידות של המנות a ו-b צריכות להיות זהות.

מידע על StableHLO זמין במאמר StableHLO – triangular_solve.

טופל

מידע נוסף זמין במאמר בנושא XlaBuilder::Tuple.

טופל שמכיל מספר משתנה של נקודות אחיזה לנתונים, שלכל אחת מהן יש צורה משלה.

Tuple(elements)

ארגומנטים סוג סמנטיקה
elements וקטור של XlaOp מערך N מסוג T

זה דומה ל-std::tuple ב-C++. באופן עקרוני:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);

אפשר לפרק טאפלים (לגשת אליהם) באמצעות הפעולה GetTupleElement.

מידע על StableHLO זמין במאמר בנושא StableHLO – tuple.

אף שהפונקציה

מידע נוסף זמין במאמר בנושא XlaBuilder::While.

While(condition, body, init)

ארגומנטים סוג סמנטיקה
condition XlaComputation ‫XlaComputation מסוג T -> PRED שמגדיר את תנאי הסיום של הלולאה.
body XlaComputation ‫XlaComputation מסוג T -> T שמגדיר את גוף הלולאה.
init T הערך הראשוני של הפרמטר של condition ושל body.

מבצע את הפעולות של body ברצף עד שהפעולה של condition נכשלת. הלולאה הזו דומה ללולאת while טיפוסית בשפות רבות אחרות, למעט ההבדלים וההגבלות שמפורטים בהמשך.

  • צומת While מחזיר ערך מסוג T, שהוא התוצאה מההפעלה האחרונה של body.
  • הצורה של הסוג T נקבעת באופן סטטי וחייבת להיות זהה בכל האיטרציות.

הפרמטרים T של החישובים מאותחלים עם הערך init באיטרציה הראשונה, ומעודכנים אוטומטית לתוצאה החדשה מ-body בכל איטרציה עוקבת.

מקרה שימוש מרכזי אחד של צומת While הוא הטמעה של ביצוע חוזר של אימון ברשתות עצביות. בהמשך מוצג קוד מדומה פשוט עם תרשים שמייצג את החישוב. הקוד נמצא בכתובת while_test.cc. הסוג T בדוגמה הזו הוא Tuple שמורכב מ-int32 לספירת האיטרציות ומ-vector[10] לאקומולטור. ב-1,000 איטרציות, הלולאה ממשיכה להוסיף וקטור קבוע לאוגר.

// Pseudocode for the computation.
init = {0, zero_vector[10]} // Tuple of int32 and float[10].
result = init;
while (result(0) < 1000) {
  iteration = result(0) + 1;
  new_vector = result(1) + constant_vector[10];
  result = {iteration, new_vector};
}

מידע על StableHLO זמין במאמר StableHLO - while.

Xor

מידע נוסף זמין במאמר בנושא XlaBuilder::Xor.

מבצעת XOR לפי רכיבים של lhs ו-rhs.

Xor(lhs, rhs)

ארגומנטים סוג סמנטיקה
lhs XlaOp אופרנד בצד ימין: מערך מסוג T
rhs XlaOp אופרנד בצד ימין: מערך מסוג T

הצורות של הארגומנטים צריכות להיות דומות או תואמות. במסמכי התיעוד בנושא שידור מוסבר מהי תאימות של צורות. התוצאה של פעולה היא מערך שנוצר משידור של שני מערכי הקלט. בגרסה הזו, פעולות בין מערכים בדרגות שונות לא נתמכות, אלא אם אחד מהאופרנדים הוא סקלר.

קיימת וריאציה חלופית עם תמיכה בשידור רב-ממדי עבור Xor:

Xor(lhs,rhs, broadcast_dimensions)

ארגומנטים סוג סמנטיקה
lhs XlaOp האופרנד בצד ימין: מערך מסוג T
rhs XlaOp האופרנד בצד ימין: מערך מסוג T
broadcast_dimension ArraySlice איזה מאפיין בצורת היעד תואם לכל מאפיין בצורת האופרנד

צריך להשתמש בווריאנט הזה של הפעולה לפעולות אריתמטיות בין מערכים בדרגות שונות (כמו הוספת מטריצה לווקטור).

האופרנד הנוסף broadcast_dimensions הוא פרוסת מספרים שלמים שמציינת את המימדים שבהם יש להשתמש לשידור האופרנדים. הסמנטיקה מתוארת בפירוט בדף השידור.

מידע על StableHLO זמין במאמר StableHLO – xor.