ข้อมูลต่อไปนี้จะอธิบายความหมายของการดำเนินการที่กำหนดไว้ในอินเทอร์เฟซ XlaBuilder
โดยปกติแล้ว การดำเนินการเหล่านี้จะจับคู่แบบหนึ่งต่อหนึ่งกับการดำเนินการที่กำหนดไว้ในอินเทอร์เฟซ RPC ใน xla_data.proto
หมายเหตุเกี่ยวกับการตั้งชื่อ: ข้อมูลทั่วไปประเภท XLA ที่ต้องจัดการคืออาร์เรย์ N มิติที่มีองค์ประกอบของประเภทที่เป็นแบบเดียวกัน (เช่น Float 32 บิต) ตลอดทั้งเอกสารประกอบ array จะใช้ในการระบุอาร์เรย์มิติข้อมูลที่กำหนดเอง เพื่อความสะดวก กรณีพิเศษจะมีชื่อที่เจาะจงและคุ้นเคยมากกว่า เช่น เวกเตอร์คืออาร์เรย์ 1 มิติ และเมทริกซ์คืออาร์เรย์ 2 มิติ
AfterAll
ดูเพิ่มเติมที่
XlaBuilder::AfterAll
AfterAll จะใช้โทเค็นจำนวนแปรผันและสร้างโทเค็นรายการเดียว โทเค็นเป็นประเภทพื้นฐานที่สามารถแยกชุดข้อความระหว่างการดำเนินการที่ส่งผลข้างเคียงเพื่อบังคับใช้การจัดลำดับได้ คุณใช้ AfterAll
เป็นการรวมโทเค็นเพื่อเรียงลำดับการดำเนินการหลังจากการดำเนินการที่ตั้งไว้ได้
AfterAll(operands)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operands |
XlaOp |
จำนวนโทเค็นแปรผัน |
AllGather
ดูเพิ่มเติมที่
XlaBuilder::AllGather
ดำเนินการเชื่อมต่อตัวจำลองต่างๆ
AllGather(operand, all_gather_dim, shard_count, replica_group_ids,
channel_id)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand
|
XlaOp
|
อาร์เรย์เพื่อเชื่อมโยงข้อมูลจำลอง |
all_gather_dim |
int64 |
มิติข้อมูลการต่อกัน |
replica_groups
|
เวกเตอร์ของเวกเตอร์ของ
int64 |
กลุ่มที่ใช้ ต่อเข้าด้วยกัน |
channel_id
|
ไม่บังคับ int64
|
รหัสแชแนลที่ไม่บังคับ สำหรับการสื่อสารข้ามโมดูล |
replica_groups
เป็นรายการของกลุ่มตัวจำลองที่มีการดำเนินการต่อ (จะดึงรหัสการจำลองสำหรับตัวจำลองปัจจุบันได้โดยใช้ReplicaId
) ลำดับของตัวจำลองในแต่ละกลุ่มจะเป็นตัวกำหนดลำดับอินพุตในผลลัพธ์replica_groups
ต้องว่างเปล่า (ในกรณีนี้ตัวจำลองทั้งหมดจะเป็นของกลุ่มเดียว เรียงลำดับจาก0
ถึงN - 1
) หรือมีจำนวนองค์ประกอบเท่ากับจำนวนตัวจำลอง ตัวอย่างเช่นreplica_groups = {0, 2}, {1, 3}
ทำการเชื่อมข้อมูลระหว่างตัวจำลอง0
กับ2
กับ1
กับ3
shard_count
คือขนาดของกลุ่มตัวจำลองแต่ละกลุ่ม เราต้องใช้ค่านี้ในกรณีที่replica_groups
ว่างเปล่าchannel_id
ใช้สำหรับการสื่อสารข้ามโมดูล: มีเพียงการดำเนินการall-gather
ที่มีchannel_id
เดียวกันเท่านั้นที่สื่อสารกันได้
รูปร่างเอาต์พุตคือรูปร่างอินพุตที่มี all_gather_dim
ทำให้ใหญ่ขึ้น shard_count
เท่า ตัวอย่างเช่น หากมีตัวจำลอง 2 ตัวและตัวถูกดำเนินการมีค่า [1.0, 2.5]
และ [3.0, 5.25]
ตามลำดับในตัวจำลอง 2 ตัว ค่าเอาต์พุตจากการดำเนินการนี้ที่ all_gather_dim
คือ 0
จะเป็น [1.0, 2.5, 3.0,
5.25]
สำหรับตัวจำลองทั้ง 2 รายการ
AllReduce
ดูเพิ่มเติมที่
XlaBuilder::AllReduce
ทำการคำนวณที่กำหนดเองกับตัวจำลองต่างๆ
AllReduce(operand, computation, replica_group_ids, channel_id)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand
|
XlaOp
|
อาร์เรย์หรือแถวของอาร์เรย์ที่ไม่ว่างเปล่า เพื่อลดตัวจำลอง |
computation |
XlaComputation |
การคํานวณการลด |
replica_groups
|
เวกเตอร์ของเวกเตอร์ของ
int64 |
กลุ่มที่จะมีการลด |
channel_id
|
ไม่บังคับ int64
|
รหัสแชแนลที่ไม่บังคับ สำหรับการสื่อสารข้ามโมดูล |
- เมื่อ
operand
เป็น Tuple ของอาร์เรย์ จะมีการดำเนินการแบบลดทั้งหมดในแต่ละองค์ประกอบของ Tuple replica_groups
คือรายการกลุ่มตัวจำลองที่มีการดำเนินการลด (จะดึงรหัสการจำลองสำหรับตัวจำลองปัจจุบันได้โดยใช้ReplicaId
)replica_groups
ต้องว่างเปล่า (ในกรณีที่ตัวจำลองทั้งหมดอยู่ในกลุ่มเดียว) หรือมีจำนวนองค์ประกอบเท่ากับจำนวนตัวจำลอง ตัวอย่างเช่นreplica_groups = {0, 2}, {1, 3}
ทำการลดตัวจำลอง0
กับ2
และ1
กับ3
channel_id
ใช้สำหรับการสื่อสารข้ามโมดูล: มีเพียงการดำเนินการall-reduce
ที่มีchannel_id
เดียวกันเท่านั้นที่สื่อสารกันได้
รูปร่างเอาต์พุตจะเหมือนกับรูปร่างอินพุต ตัวอย่างเช่น หากมีการจำลอง 2 รายการและตัวถูกดำเนินการมีค่า [1.0, 2.5]
และ [3.0, 5.25]
ตามลำดับของตัวจำลอง 2 ตัว ค่าเอาต์พุตจากการคำนวณ op และการคำนวณผลรวมจะเป็น [4.0, 7.75]
บนตัวจำลองทั้ง 2 รายการ หากอินพุตเป็น Tuple เอาต์พุตจะเป็น Tuple เช่นกัน
การคำนวณผลลัพธ์ของ AllReduce
ต้องมีอินพุต 1 รายการจากตัวจำลองแต่ละรายการ ดังนั้นหากตัวจำลองรายการหนึ่งเรียกใช้โหนด AllReduce
มากกว่าอีกโหนดหนึ่ง ตัวจำลองเดิมจะรอตลอดไป เนื่องจากตัวจำลองทั้งหมดเรียกใช้โปรแกรมเดียวกัน จึงไม่มีวิธีเกิดขึ้นมากนัก แต่ก็เป็นไปได้เมื่อเงื่อนไขของลูปขึ้นอยู่กับข้อมูลจาก infeed และข้อมูลที่ป้อนทำให้การวนรอบเมื่อทำซ้ำเวลาในตัวจำลองรายการหนึ่งมากกว่าอีกตัวหนึ่ง
AllToAll
ดูเพิ่มเติมที่
XlaBuilder::AllToAll
AllToAll เป็นการดำเนินการร่วมซึ่งส่งข้อมูลจากแกนทั้งหมดไปยังแกนทั้งหมด โดยมี 2 ระยะ ดังนี้
- ระยะกระจาย ในแต่ละแกน ตัวถูกดำเนินการจะแบ่งออกเป็นจำนวนบล็อก
split_count
ตามsplit_dimensions
และบล็อกกระจัดกระจายไปยังแกนทั้งหมด เช่น ส่งบล็อก Ih ไปยังแกน Ith - ระยะรวมตัว แต่ละแกนจะเชื่อมบล็อกที่ได้รับตามแนว
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
- รูปร่างของตัวถูกดำเนินการไม่ใช่ Tuple
AllToAll(operand, split_dimension, concat_dimension, split_count,
replica_groups)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์อินพุตมิติ n |
split_dimension
|
int64
|
ค่าในช่วง [0,
n) ที่มีชื่อมิติข้อมูลซึ่งตัวถูกดำเนินการถูกแยก |
concat_dimension
|
int64
|
ค่าในช่วง [0,
n) ที่มีชื่อมิติข้อมูลพร้อมกับบล็อกการแยกที่เชื่อมต่ออยู่ |
split_count
|
int64
|
จำนวนแกนที่เข้าร่วมการดำเนินการนี้ หาก replica_groups ว่างเปล่า ค่านี้ควรเป็นจำนวนของตัวจำลอง หรือควรเท่ากับจำนวนตัวจำลองในแต่ละกลุ่ม |
replica_groups
|
ReplicaGroup เวกเตอร์
|
แต่ละกลุ่มจะมีรายการรหัสข้อมูลจำลอง |
ด้านล่างแสดงตัวอย่างของ Alltoall
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 ส่วนตามมิติข้อมูล 0 ดังนั้นแต่ละส่วนจะมีรูปร่าง f32[4,4] ทั้ง 4 ส่วนกระจายอยู่ในแกนทั้งหมด จากนั้นแกนแต่ละแกนจะเชื่อมส่วนที่ได้รับ ตามมิติข้อมูล 1 ตามลำดับของแกนหลัก 0-4 ดังนั้นเอาต์พุตในแต่ละแกน จะมีรูปร่าง f32[16,4]
BatchNormGrad
ดูคำอธิบายโดยละเอียดของอัลกอริทึมได้ที่
XlaBuilder::BatchNormGrad
และเอกสารการปรับรูปแบบมาตรฐานแบบกลุ่มต้นฉบับ
คำนวณการไล่ระดับสีของค่าปกติแบทช์
BatchNormGrad(operand, scale, mean, variance, grad_output, epsilon, feature_index)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติ n ที่จะถูกทำให้เป็นมาตรฐาน (x) |
scale |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\gamma\)) |
mean |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\mu\)) |
variance |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\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
การไล่ระดับสีทั้ง 3 แบบกำหนดตามสูตรต่อไปนี้ (สมมติว่าอาร์เรย์ 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} \]
อินพุต mean
และ variance
แสดงถึงค่าช่วงเวลาในมิติข้อมูลแบบกลุ่มและเชิงพื้นที่
ประเภทเอาต์พุตจะเป็น Tuple ของแฮนเดิล 3 ตัว ได้แก่
เอาต์พุต | ประเภท | อรรถศาสตร์ |
---|---|---|
grad_operand
|
XlaOp
|
การไล่ระดับสีตามอินพุต operand ($\nabla
x$) |
grad_scale
|
XlaOp
|
การไล่ระดับสีตามอินพุต scale ($\nabla
\gamma$) |
grad_offset
|
XlaOp
|
การไล่ระดับสีตามอินพุต offset ($\nabla
\beta$) |
BatchNormInference
ดูคำอธิบายโดยละเอียดของอัลกอริทึมได้ที่
XlaBuilder::BatchNormInference
และเอกสารการปรับรูปแบบมาตรฐานแบบกลุ่มต้นฉบับ
ทำให้อาร์เรย์เป็นค่ามาตรฐานตามมิติข้อมูลแบบกลุ่มและเชิงพื้นที่
BatchNormInference(operand, scale, offset, mean, variance, epsilon, feature_index)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติ n ที่จะถูกทำให้เป็นมาตรฐาน |
scale |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ |
offset |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ |
mean |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ |
variance |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ |
epsilon |
float |
ค่า Epsilon |
feature_index |
int64 |
ดัชนีสำหรับมิติข้อมูลฟีเจอร์ใน operand |
สำหรับแต่ละองค์ประกอบในมิติข้อมูลของฟีเจอร์ (feature_index
คือดัชนีสำหรับมิติข้อมูลของฟีเจอร์ใน operand
) การดำเนินการจะคำนวณค่าเฉลี่ยและความแปรปรวนในมิติข้อมูลอื่นๆ ทั้งหมด และใช้ค่าเฉลี่ยและความแปรปรวนเพื่อทำให้แต่ละองค์ประกอบใน operand
เป็นมาตรฐาน feature_index
ต้องเป็นดัชนีที่ถูกต้องสำหรับมิติข้อมูลฟีเจอร์ใน operand
BatchNormInference
เทียบเท่ากับการเรียกใช้ BatchNormTraining
โดยไม่ต้องคํานวณ mean
และ variance
สําหรับแต่ละกลุ่ม และจะใช้อินพุต mean
และ variance
แทนเป็นค่าโดยประมาณ วัตถุประสงค์ของการดำเนินการนี้คือเพื่อลดเวลาในการตอบสนองในการอนุมาน จึงมีชื่อว่า BatchNormInference
เอาต์พุตจะเป็นอาร์เรย์ n-dimensional ที่ได้รับการทำให้เป็นมาตรฐานซึ่งมีรูปทรงเดียวกับอินพุต operand
BatchNormTraining
ดูเพิ่มเติมเกี่ยวกับ
XlaBuilder::BatchNormTraining
และ the original batch normalization paper
สำหรับคำอธิบายโดยละเอียดของอัลกอริทึม
ทำให้อาร์เรย์เป็นค่ามาตรฐานตามมิติข้อมูลแบบกลุ่มและเชิงพื้นที่
BatchNormTraining(operand, scale, offset, epsilon, feature_index)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติ n ที่จะถูกทำให้เป็นมาตรฐาน (x) |
scale |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\gamma\)) |
offset |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\beta\)) |
epsilon |
float |
ค่า Epsilon (\(\epsilon\)) |
feature_index |
int64 |
ดัชนีสำหรับมิติข้อมูลฟีเจอร์ใน operand |
สำหรับแต่ละองค์ประกอบในมิติข้อมูลของฟีเจอร์ (feature_index
คือดัชนีสำหรับมิติข้อมูลของฟีเจอร์ใน 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\)
ระบบจะเพิ่มค่า epsilon เพื่อหลีกเลี่ยงข้อผิดพลาดการหารด้วยศูนย์
ประเภทเอาต์พุตจะเป็น Tuple ของ XlaOp
3 รายการ ได้แก่
เอาต์พุต | ประเภท | อรรถศาสตร์ |
---|---|---|
output
|
XlaOp
|
อาร์เรย์มิติ n ที่มีรูปทรงเดียวกับอินพุต
operand (y) |
batch_mean |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\mu\)) |
batch_var |
XlaOp |
อาร์เรย์มิติข้อมูล 1 รายการ (\(\sigma^2\)) |
batch_mean
และ batch_var
คือโมเมนต์ที่คำนวณในมิติข้อมูลกลุ่มและมิติข้อมูลเชิงพื้นที่โดยใช้สูตรด้านบน
BitcastConvertType
ดูเพิ่มเติมที่
XlaBuilder::BitcastConvertType
ดำเนินการบิตแคสต์ตามองค์ประกอบจากรูปร่างข้อมูลไปยังรูปร่างเป้าหมาย เช่นเดียวกับ tf.bitcast
ใน TensorFlow ขนาดอินพุตและเอาต์พุตต้องตรงกัน เช่น องค์ประกอบ s32
จะกลายเป็นองค์ประกอบ f32
ผ่านกิจวัตรบิตแคสต์ และองค์ประกอบ s32
1 รายการจะกลายเป็นองค์ประกอบ s8
4 รายการ จะมีการใช้ Bitcast ในรูปแบบแคสต์ระดับต่ำ ดังนั้นเครื่องที่มีการแสดงจุดลอยตัวที่แตกต่างกันจะให้ผลลัพธ์ที่แตกต่างกัน
BitcastConvertType(operand, new_element_type)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ของประเภท T โดยมีความสว่าง D |
new_element_type |
PrimitiveType |
ประเภท U |
ขนาดของตัวถูกดำเนินการและรูปร่างเป้าหมายต้องตรงกัน นอกเหนือจากมิติข้อมูลสุดท้ายซึ่งจะเปลี่ยนแปลงตามอัตราส่วนของขนาดดั้งเดิมก่อนและหลังการแปลง
ประเภทองค์ประกอบต้นทางและปลายทางต้องไม่ใช่ 2 พร้อมกัน
การแปลงบิตแคสต์เป็นประเภทพื้นฐานที่มีความกว้างต่างกัน
คำสั่ง HLO ของ BitcastConvert
รองรับกรณีที่ขนาดขององค์ประกอบประเภทเอาต์พุต T'
ไม่เท่ากับขนาดขององค์ประกอบอินพุต T
เนื่องจากการดำเนินการทั้งหมดเป็นแนวคิดของบิตแคสต์และไม่ได้เปลี่ยนไบต์พื้นฐาน รูปร่างขององค์ประกอบเอาต์พุตจึงต้องเปลี่ยนแปลง สำหรับ B = sizeof(T), B' =
sizeof(T')
มี 2 กรณีที่เป็นไปได้
ประการแรก เมื่อ 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)
โปรดทราบว่าการแปลงระหว่างบิตกว้างที่แตกต่างกันไม่ใช่ Elementwise
ประกาศ
ดูเพิ่มเติมที่
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
BroadcastInDim
ดูเพิ่มเติมที่
XlaBuilder::BroadcastInDim
ขยายขนาดและอันดับของอาร์เรย์โดยการทำซ้ำข้อมูลในอาร์เรย์
BroadcastInDim(operand, out_dim_size, broadcast_dimensions)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ที่จะทำซ้ำ |
out_dim_size |
ArraySlice<int64> |
ขนาดของรูปร่างเป้าหมาย |
broadcast_dimensions |
ArraySlice<int64> |
มิติข้อมูลใดในรูปร่างเป้าหมาย แต่ละมิติของรูปร่างตัวถูกดำเนินการสอดคล้องกับ |
คล้ายกับการออกอากาศ แต่อนุญาตให้เพิ่มมิติข้อมูลได้ทุกที่และขยายขนาดที่มีอยู่ด้วยขนาด 1
operand
ออกอากาศเป็นรูปร่างที่อธิบายโดย out_dim_size
broadcast_dimensions
จะจับคู่มิติของ operand
กับขนาดของรูปร่างเป้าหมาย นั่นคือ มิติของตัวถูกดำเนินการจะจับคู่กับมิติข้อมูล broadcast_dimension[i] ของรูปร่างเอาต์พุต ขนาดของ operand
ต้องมีขนาด 1 หรือมีขนาดเดียวกับมิติข้อมูลในรูปร่างเอาต์พุตที่แมปไว้ ส่วนมิติข้อมูลที่เหลือจะเป็นขนาด 1 การออกอากาศมิติข้อมูลที่น้อยลงแล้วจะเริ่มออกอากาศตามมิติข้อมูลที่เสื่อมลงเหล่านี้เพื่อให้ได้รูปร่างเอาต์พุต ระบบอธิบายไว้อย่างละเอียดในหน้าการออกอากาศ
โทร
ดูเพิ่มเติมที่
XlaBuilder::Call
เรียกใช้การคำนวณด้วยอาร์กิวเมนต์ที่ระบุ
Call(computation, args...)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
computation |
XlaComputation |
การคำนวณประเภท T_0, T_1, ..., T_{N-1} -> S ที่มีพารามิเตอร์ N ประเภทที่กำหนดเอง |
args |
ลำดับ N XlaOp วินาที |
อาร์กิวเมนต์ N ประเภทที่กำหนดเอง |
อาร์กิวเมนต์และประเภทของ args
ต้องตรงกับพารามิเตอร์ของ computation
แต่ต้องไม่มี args
ชูเลสกี
ดูเพิ่มเติมที่
XlaBuilder::Cholesky
คำนวณการแตกตัวแบบ 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
ไม่ใช่ค่าบวกแบบสมมาตร (เฮอร์มิเชียน) ผลลัพธ์จะเป็นตัวกำหนดการติดตั้งใช้งาน
แบบมีตัวหนีบ
ดูเพิ่มเติมที่
XlaBuilder::Clamp
ยึดตัวถูกดำเนินการให้อยู่ภายในช่วงระหว่างค่าต่ำสุดและสูงสุด
Clamp(min, operand, max)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
min |
XlaOp |
อาร์เรย์ประเภท T |
operand |
XlaOp |
อาร์เรย์ประเภท T |
max |
XlaOp |
อาร์เรย์ประเภท T |
เมื่อมีตัวถูกดำเนินการและค่าต่ำสุดและสูงสุด ให้แสดงผลตัวถูกดำเนินการหากอยู่ภายในช่วงระหว่างค่าต่ำสุดและสูงสุด หรือแสดงผลค่าต่ำสุดหากตัวถูกดำเนินการต่ำกว่าช่วงนี้ หรือค่าสูงสุดหากตัวถูกดำเนินการอยู่เหนือช่วงนี้ นั่นคือ clamp(a, x, b) = min(max(a, x), b)
อาร์เรย์ทั้ง 3 รายการต้องมีรูปร่างเดียวกัน นอกจากนี้ 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};
ยุบ
ดู XlaBuilder::Collapse
และการดําเนินการ tf.reshape
เพิ่มเติม
ยุบมิติข้อมูลของอาร์เรย์เป็นมิติข้อมูลเดียว
Collapse(operand, dimensions)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ประเภท T |
dimensions |
int64 เวกเตอร์ |
ส่วนย่อยของมิติข้อมูล T ที่เรียงต่อกันตามลำดับ |
การยุบจะแทนที่ชุดย่อยของมิติข้อมูลของตัวถูกดำเนินการที่กำหนดด้วยมิติข้อมูลเดียว อาร์กิวเมนต์อินพุตเป็นอาร์เรย์ที่กำหนดเองของประเภท T และเวกเตอร์ค่าคงที่เวลาคอมไพล์ของดัชนีมิติข้อมูล ดัชนีมิติข้อมูลต้องเป็นรายการตามลำดับ (ตัวเลขมิติข้อมูลต่ำถึงสูง) ชุดย่อยของมิติข้อมูล T ที่อยู่ติดกัน ดังนั้น {0, 1, 2}, {0, 1} หรือ {1, 2} คือชุดมิติข้อมูลที่ถูกต้องทั้งหมด แต่ {1, 0} หรือ {0, 2} ไม่ใช่ มิติข้อมูลเหล่านี้จะถูกแทนที่ด้วยมิติข้อมูลใหม่เพียงรายการเดียว ในตำแหน่งเดียวกันในลำดับมิติข้อมูลกับมิติข้อมูลที่เข้ามาแทนที่ โดยมีขนาดมิติข้อมูลใหม่เท่ากับผลิตภัณฑ์ของขนาดมิติข้อมูลเดิม จำนวนมิติข้อมูลต่ำสุดใน dimensions
คือมิติข้อมูลต่างๆ ที่ช้าที่สุด (หลักที่สุด) ใน Nest Loop ซึ่งยุบมิติข้อมูลเหล่านี้ และจำนวนมิติข้อมูลสูงสุดจะต่างกันเร็วที่สุด (น้อยที่สุด) โปรดดูโอเปอเรเตอร์ 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} };
CollectivePermute
ดูเพิ่มเติมที่
XlaBuilder::CollectivePermute
CollectivePermute เป็นการดำเนินการร่วมที่ส่งและรับข้อมูลข้ามตัวจำลอง
CollectivePermute(operand, source_target_pairs)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์อินพุตมิติ n |
source_target_pairs |
<int64, int64> เวกเตอร์ |
รายการคู่ (source_replica_id, target_replica_id) สำหรับแต่ละคู่ ระบบจะส่งตัวถูกดำเนินการจากตัวจำลองต้นทางไปยังตัวจำลองเป้าหมาย |
โปรดทราบว่า source_target_pair
มีข้อจำกัดดังต่อไปนี้
- คู่ 2 คู่ไม่ควรมีรหัสตัวจำลองเป้าหมายเดียวกัน และไม่ควรมีรหัสตัวจำลองแหล่งที่มาเหมือนกัน
- หากรหัสการจำลองไม่ใช่เป้าหมายในคู่ใดๆ เอาต์พุตบนตัวจำลองนั้นจะเป็น tensor ที่ประกอบด้วย 0 ซึ่งมีรูปร่างเดียวกับอินพุต
เชื่อมต่อ
ดูเพิ่มเติมที่
XlaBuilder::ConcatInDim
Concatenate เขียนอาร์เรย์จากตัวถูกดำเนินการอาร์เรย์หลายรายการ อาร์เรย์มีอันดับเดียวกันกับตัวถูกดำเนินการของอาร์เรย์อินพุตแต่ละรายการ (ซึ่งต้องอยู่ในอันดับเดียวกัน) และมีอาร์กิวเมนต์ตามลำดับที่ระบุไว้
Concatenate(operands..., dimension)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operands |
ลำดับ N XlaOp |
N อาร์เรย์ของประเภท T ที่มีมิติข้อมูล [L0, L1, ...] ต้องมี N >= 1 |
dimension |
int64 |
ค่าในช่วง [0, N) ที่มีชื่อมิติข้อมูลที่จะเชื่อมต่อระหว่าง operands |
มิติข้อมูลทั้งหมดต้องเหมือนกัน ยกเว้น dimension
เนื่องจาก XLA ไม่รองรับอาร์เรย์ที่ "ขรุขระ" และโปรดทราบว่าค่าอันดับ -0 จะเชื่อมโยงกันไม่ได้ (เนื่องจากไม่สามารถตั้งชื่อมิติข้อมูลตามที่มีการเชื่อมโยงได้)
ตัวอย่าง 1 มิติ:
Concat({ {2, 3}, {4, 5}, {6, 7} }, 0)
>>> {2, 3, 4, 5, 6, 7}
ตัวอย่าง 2 มิติ:
let a = {
{1, 2},
{3, 4},
{5, 6},
};
let b = {
{7, 8},
};
Concat({a, b}, 0)
>>> {
{1, 2},
{3, 4},
{5, 6},
{7, 8},
}
แผนภาพ:
มีเงื่อนไข
ดูเพิ่มเติมที่
XlaBuilder::Conditional
Conditional(pred, true_operand, true_computation, false_operand,
false_computation)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
pred |
XlaOp |
สเกลาร์ของประเภท PRED |
true_operand |
XlaOp |
อาร์กิวเมนต์ของประเภท \(T_0\) |
true_computation |
XlaComputation |
การคำนวณประเภท Xla \(T_0 \to S\) |
false_operand |
XlaOp |
อาร์กิวเมนต์ของประเภท \(T_1\) |
false_computation |
XlaComputation |
การคำนวณประเภท Xla \(T_1 \to S\) |
เรียกใช้ true_computation
หาก pred
เป็น true
false_computation
หาก pred
เป็น false
และแสดงผล
true_computation
ต้องใช้อาร์กิวเมนต์ประเภทเดียว \(T_0\) และจะมีการเรียกใช้ด้วย true_operand
ซึ่งต้องเป็นประเภทเดียวกัน โดย false_computation
ต้องใช้อาร์กิวเมนต์ประเภทเดียว \(T_1\) และจะเรียกใช้ด้วย false_operand
ซึ่งต้องเป็นประเภทเดียวกัน ประเภทของค่าที่ส่งคืนของ true_computation
และ false_computation
ต้องเหมือนกัน
โปรดทราบว่าระบบจะเรียกใช้ true_computation
และ false_computation
เพียงรายการเดียวเท่านั้น ทั้งนี้ขึ้นอยู่กับค่าของ pred
Conditional(branch_index, branch_computations, branch_operands)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
branch_index |
XlaOp |
สเกลาร์ของประเภท S32 |
branch_computations |
ลำดับ N XlaComputation |
การคำนวณประเภท \(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 เริ่มต้น
branch_computations[b]
แต่ละรายการต้องใช้อาร์กิวเมนต์ประเภท \(T_b\) ตัวเดียว และจะเรียกด้วย branch_operands[b]
ซึ่งต้องเป็นประเภทเดียวกัน ประเภทของค่าที่ส่งคืนของ branch_computations[b]
แต่ละรายการต้องเหมือนกัน
โปรดทราบว่าระบบจะเรียกใช้ branch_computations
เพียงรายการเดียวโดยขึ้นอยู่กับค่าของ branch_index
Conv. (Conv.)
ดูเพิ่มเติมที่
XlaBuilder::Conv
เป็น ConvWithGeneralPadding แต่ระยะห่างจากขอบแบบระยะสั้นเป็น "เดียวกัน" หรือ "ใช้งานได้" ระยะห่างจากขอบเดียวกันจะคั่นอินพุต (lhs
) ด้วย 0 เพื่อให้เอาต์พุตมีรูปร่างเดียวกันกับอินพุตเมื่อไม่นำแป้นนี้เข้าไปในบัญชี ระยะห่างจากขอบที่ใช้งานได้หมายถึงไม่มีระยะห่างจากขอบ
ConvWithGeneralPadding (คอนโวลูชัน)
ดูเพิ่มเติมที่
XlaBuilder::ConvWithGeneralPadding
คำนวณคอนโวลูชันของชนิดที่ใช้ในโครงข่ายประสาท ในตัวอย่างนี้ คอนโวลูชันอาจมองได้ว่าเป็นหน้าต่าง n มิติที่เคลื่อนที่ผ่านพื้นที่ฐาน n และคํานวณสําหรับแต่ละตําแหน่งที่เป็นไปได้ของหน้าต่าง
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs |
XlaOp |
อันดับ n+2 อาร์เรย์ของอินพุต |
rhs |
XlaOp |
อันดับอาร์เรย์ n+2 ของน้ำหนักเคอร์เนล |
window_strides |
ArraySlice<int64> |
อาร์เรย์ n-d ของเคอร์เนล |
padding |
ArraySlice< pair<int64,int64>> |
อาร์เรย์ n-d ของระยะห่างจากขอบ (ต่ำ, สูง) |
lhs_dilation |
ArraySlice<int64> |
อาร์เรย์ปัจจัยการขยาย n-d lhs |
rhs_dilation |
ArraySlice<int64> |
อาร์เรย์ปัจจัยการขยาย n-d rhs |
feature_group_count |
int64 | จำนวนกลุ่มฟีเจอร์ |
batch_group_count |
int64 | จำนวนกลุ่มแบตช์ |
กำหนดให้ n เป็นจำนวนของมิติข้อมูลเชิงพื้นที่ อาร์กิวเมนต์ lhs
คืออาร์เรย์อันดับ n+2
ที่อธิบายพื้นที่ฐาน สิ่งนี้เรียกว่าอินพุต แม้ว่าแน่นอนว่า
rhs จะเป็นอินพุตก็ตาม ในเครือข่ายประสาทเทียม อินพุตเหล่านี้คือการเปิดใช้งาน
มิติข้อมูล n+2 มีดังนี้
batch
: แต่ละพิกัดในมิติข้อมูลนี้หมายถึงอินพุตอิสระที่มีการดำเนินการคอนโวลูชัน (Convolution)z/depth/features
: ตำแหน่งแต่ละตำแหน่ง (y,x) ในพื้นที่ฐานจะมีเวกเตอร์เชื่อมโยงอยู่ ซึ่งเข้าไปในมิติข้อมูลนี้spatial_dims
: อธิบายมิติข้อมูลเชิงพื้นที่n
ที่กำหนดพื้นที่ฐานที่หน้าต่างย้ายผ่าน
อาร์กิวเมนต์ rhs
คืออาร์เรย์อันดับ n+2 ที่อธิบายตัวกรอง/เคอร์เนล/หน้าต่างแบบ Convolutional มิติข้อมูลมีดังนี้
output-z
: มิติข้อมูลz
ของเอาต์พุตinput-z
: ขนาดของมิติข้อมูลนี้คูณfeature_group_count
ควรเท่ากับขนาดของมิติข้อมูลz
ในหน่วย lhsspatial_dims
: อธิบายมิติเชิงพื้นที่n
ที่กำหนดหน้าต่าง n-d ที่เคลื่อนที่ผ่านพื้นที่ฐาน
อาร์กิวเมนต์ window_strides
ระบุการก้าวของหน้าต่าง Convolutional ในมิติข้อมูลเชิงพื้นที่ เช่น หากการวิ่งในมิติเชิงพื้นที่แรกคือ 3 หน้าต่างจะวางได้เฉพาะในพิกัดที่ดัชนีเชิงพื้นที่แรกหารด้วย 3 เท่านั้น
อาร์กิวเมนต์ padding
ระบุจำนวนระยะห่างจากขอบเป็น 0 ที่จะนำไปใช้กับพื้นที่ฐาน จำนวนระยะห่างจากขอบอาจเป็นลบได้ ค่าสัมบูรณ์ของระยะห่างจากขอบที่เป็นลบจะระบุจำนวนองค์ประกอบที่ต้องนำออกจากมิติข้อมูลที่ระบุก่อนกระทำคอนโวลูชัน (Convolution) padding[0]
ระบุระยะห่างจากขอบสำหรับมิติข้อมูล y
และ padding[1]
ระบุระยะห่างจากขอบสำหรับมิติข้อมูล x
แต่ละคู่มีระยะห่างจากขอบต่ำเป็นองค์ประกอบแรก และมีระยะห่างจากขอบสูงเป็นองค์ประกอบที่ 2 โดยจะใช้ระยะห่างจากขอบต่ำในทิศทางของดัชนีด้านล่าง ส่วนระยะห่างจากขอบสูงจะใช้ในทิศทางของดัชนีที่สูงกว่า ตัวอย่างเช่น หาก padding[1]
คือ (2,3)
จะมีระยะห่างจากขอบ 2 ตัวทางด้านซ้าย และเลขศูนย์ 3 ตัวทางด้านขวาในมิติข้อมูลเชิงพื้นที่ที่ 2 การใช้ระยะห่างจากขอบเทียบเท่ากับการแทรกค่า 0 เดียวกันเหล่านั้นในอินพุต (lhs
) ก่อนสร้างคอนโวลูชัน
อาร์กิวเมนต์ lhs_dilation
และ rhs_dilation
จะระบุปัจจัยการขยายที่จะใช้กับ lhs และ rhs ตามลำดับในมิติข้อมูลเชิงพื้นที่แต่ละรายการ หากปัจจัยการขยายในมิติข้อมูลเชิงพื้นที่คือ d จะมีการใส่หลุม d-1 ระหว่างแต่ละรายการในมิติข้อมูลนั้นโดยปริยาย ซึ่งช่วยเพิ่มขนาดอาร์เรย์ ในหลุมจะมีค่าที่ไม่มีการดำเนินการ ซึ่งแปลว่าคอนโวลูชันหมายถึงซีโร
การขยายตัวของ RHS เรียกอีกอย่างว่าคอนโวลูชันที่โหดร้าย ดูรายละเอียดเพิ่มเติมได้ที่ tf.nn.atrous_conv2d
การขยาย lhs เรียกอีกอย่างว่าคอนโวลูชันการสลับกัน (Transposed Convolution) ดูรายละเอียดเพิ่มเติมได้ที่ tf.nn.conv2d_transpose
คุณใช้อาร์กิวเมนต์ feature_group_count
(ค่าเริ่มต้น 1) สำหรับ Conversion แบบกลุ่มได้ feature_group_count
ต้องเป็นตัวหารของทั้งมิติข้อมูลฟีเจอร์อินพุตและเอาต์พุต หาก feature_group_count
มากกว่า 1 หมายความว่าในเชิงมโนทัศน์มิติข้อมูลของฟีเจอร์อินพุตและเอาต์พุตและมิติข้อมูลของฟีเจอร์เอาต์พุตrhs
จะแบ่งออกเป็นกลุ่ม feature_group_count
หลายกลุ่มเท่าๆ กัน โดยแต่ละกลุ่มประกอบด้วยฟีเจอร์ลำดับต่อมาติดต่อกัน มิติข้อมูลฟีเจอร์อินพุตของ rhs
ต้องเท่ากับมิติข้อมูลของฟีเจอร์อินพุต lhs
หารด้วย feature_group_count
(เพื่อให้มีขนาดของกลุ่มฟีเจอร์อินพุตอยู่แล้ว) ระบบจะใช้กลุ่มที่ i ร่วมกันเพื่อคำนวณ feature_group_count
สำหรับ Convolution ที่แยกกันหลายรายการ ผลลัพธ์ของคอนโวลูชันเหล่านี้จะต่อกันในมิติข้อมูลของฟีเจอร์เอาต์พุต
สำหรับคอนโวลูชันเชิงลึก ระบบจะตั้งค่าอาร์กิวเมนต์ 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
ในหน่วย lhsz
: ขนาดเท่ากับoutput-z
บนเคอร์เนล (rhs
)spatial_dims
: 1 ค่าสำหรับตำแหน่งที่ถูกต้องแต่ละตำแหน่งของหน้าต่าง Convolution
ภาพด้านบนแสดงวิธีการทำงานของช่อง batch_group_count
อย่างมีประสิทธิภาพ เราจะแบ่ง lh ออกเป็น batch_group_count
กลุ่ม และทำแบบเดียวกันนี้สำหรับฟีเจอร์เอาต์พุต จากนั้นเราจะแปลง Pairwise และเชื่อมโยงผลลัพธ์กับมิติข้อมูลฟีเจอร์เอาต์พุตสำหรับแต่ละกลุ่ม ความหมายในการดำเนินการของมิติข้อมูลอื่นๆ ทั้งหมด (ฟีเจอร์และเชิงพื้นที่) จะยังคงเหมือนเดิม
ตำแหน่งที่ถูกต้องของหน้าต่าง Convolutional จะกำหนดโดยความก้าวหน้าและขนาดของพื้นที่ฐานหลังระยะห่างจากขอบ
หากต้องการอธิบายหน้าที่ของคอนโวลูชัน ให้พิจารณาคอนโวลูชัน 2 มิติ แล้วเลือกพิกัด batch
, z
, y
, x
คงที่ในเอาต์พุต แล้ว (y,x)
คือตำแหน่งมุมของหน้าต่างภายในพื้นที่ฐาน (เช่น มุมซ้ายบน ขึ้นอยู่กับว่าคุณตีความมิติข้อมูลเชิงพื้นที่อย่างไร) ตอนนี้เรามีหน้าต่าง 2 มิติ
ที่ถ่ายจากพื้นที่ฐาน ซึ่งจุด 2 มิติแต่ละจุดเชื่อมโยงกับเวกเตอร์ 1 มิติ
ดังนั้นเราจะได้กล่อง 3 มิติ จากเคอร์เนล Convolutional เมื่อเราแก้ไขพิกัดเอาต์พุต z
เราจึงยังมีกล่อง 3 มิติด้วย ทั้ง 2 กล่องมีมิติข้อมูลเดียวกัน เราจึงนำผลรวมของผลลัพธ์ตามองค์ประกอบระหว่าง 2 กล่อง (คล้ายกับผลิตภัณฑ์แบบจุด) ได้ ซึ่งก็คือค่าเอาต์พุต
โปรดทราบว่าในกรณีที่เป็น output-z
5 แต่ละตำแหน่งของหน้าต่างจะสร้างค่า 5 ค่าในเอาต์พุตลงในมิติข้อมูล z
ของเอาต์พุต ค่าเหล่านี้จะแตกต่างกันไปในส่วนที่ใช้เคอร์เนลแบบ Convolutional จะมีกล่องค่า 3 มิติแยกต่างหากที่ใช้สำหรับพิกัด output-z
แต่ละรายการ คุณอาจคิดว่าเป็นคอนโวลูชันที่แยกกัน 5 ตัวโดยมีตัวกรองที่ต่างกันสำหรับตัวกรองแต่ละรายการ
นี่คือรหัสเทียมสำหรับคอนโวลูชัน 2 มิติที่มีระยะห่างจากขอบและอักขระ
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;
}
ConvertElementType
ดูเพิ่มเติมที่
XlaBuilder::ConvertElementType
ทำการแปลงตามองค์ประกอบจากรูปร่างข้อมูลเป็นรูปร่างเป้าหมาย เช่นเดียวกับ static_cast
ตามองค์ประกอบใน C++ มิติข้อมูลต้องตรงกัน และ Conversion จะเป็นผู้พิจารณาตามองค์ประกอบ เช่น องค์ประกอบ s32
จะกลายเป็นองค์ประกอบ f32
ผ่านกิจวัตร Conversion s32
เป็น f32
ConvertElementType(operand, new_element_type)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ของประเภท T โดยมีความสว่าง D |
new_element_type |
PrimitiveType |
ประเภท U |
ขนาดของตัวถูกดำเนินการและรูปร่างเป้าหมายต้องตรงกัน ประเภทองค์ประกอบต้นทางและปลายทางต้องไม่ใช่ Tuple
Conversion เช่น T=s32
เป็น U=f32
จะทำกิจวัตร Conversion แบบ Int-to-Float ให้เป็นมาตรฐาน เช่น เปลี่ยนจากไป-ใกล้ที่สุด-เท่ากัน
let a: s32[3] = {0, 1, 2};
let b: f32[3] = convert(a, f32);
then b == f32[3]{0.0, 1.0, 2.0}
CrossReplicaSum
ดำเนินการ AllReduce
ด้วยการคำนวณผลรวม
CustomCall
ดูเพิ่มเติมที่
XlaBuilder::CustomCall
เรียกใช้ฟังก์ชันที่ได้จากผู้ใช้ภายในการคำนวณ
CustomCall(target_name, args..., shape)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
target_name |
string |
ชื่อฟังก์ชัน คำสั่งการโทรจะได้รับการเผยแพร่ซึ่งกำหนดเป้าหมายไปยังชื่อสัญลักษณ์นี้ |
args |
ลำดับ N XlaOp วินาที |
อาร์กิวเมนต์ N ประเภทที่กำหนดเอง ซึ่งจะส่งไปยังฟังก์ชัน |
shape |
Shape |
รูปร่างเอาต์พุตของฟังก์ชัน |
ลายเซ็นของฟังก์ชันจะเหมือนกัน ไม่ว่าอาร์กิวเมนต์หรืออาร์กิวเมนต์ประเภทใด:
extern "C" void target_name(void* out, void** in);
ตัวอย่างเช่น หากใช้ CustomCall ดังนี้
let x = f32[2] {1,2};
let y = f32[2x3] { {10, 20, 30}, {40, 50, 60} };
CustomCall("myfunc", {x, y}, f32[3x3])
ต่อไปนี้คือตัวอย่างการใช้งาน myfunc
extern "C" void myfunc(void* out, void** in) {
float (&x)[2] = *static_cast<float(*)[2]>(in[0]);
float (&y)[2][3] = *static_cast<float(*)[2][3]>(in[1]);
EXPECT_EQ(1, x[0]);
EXPECT_EQ(2, x[1]);
EXPECT_EQ(10, y[0][0]);
EXPECT_EQ(20, y[0][1]);
EXPECT_EQ(30, y[0][2]);
EXPECT_EQ(40, y[1][0]);
EXPECT_EQ(50, y[1][1]);
EXPECT_EQ(60, y[1][2]);
float (&z)[3][3] = *static_cast<float(*)[3][3]>(out);
z[0][0] = x[1] + y[1][0];
// ...
}
ฟังก์ชันที่ผู้ใช้ระบุต้องไม่มีผลข้างเคียงและการดำเนินการต้องตรงกัน
จุด
ดูเพิ่มเติมที่
XlaBuilder::Dot
Dot(lhs, rhs)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs |
XlaOp |
อาร์เรย์ประเภท T |
rhs |
XlaOp |
อาร์เรย์ประเภท T |
ความหมายที่แน่นอนของการดำเนินการนี้ขึ้นอยู่กับอันดับของตัวถูกดำเนินการ
อินพุต | เอาต์พุต | อรรถศาสตร์ |
---|---|---|
เวกเตอร์ [n] dot เวกเตอร์ [n] |
สเกลาร์ | ผลคูณเวกเตอร์แบบจุด |
เมทริกซ์ [m x k] dot เวกเตอร์ [k] |
เวกเตอร์ [m] | การคูณเวกเตอร์เมทริกซ์ |
เมทริกซ์ [m x k] dot เมทริกซ์ [k x n] |
เมทริกซ์ [m x n] | การคูณเมทริกซ์-เมทริกซ์ |
การดำเนินการนี้จะรวมผลิตภัณฑ์ทั้งหมดในมิติข้อมูลที่ 2 ของ lhs
(หรือมิติข้อมูลแรกหากมีอันดับ 1) และมิติข้อมูลแรกเป็น rhs
ซึ่งก็คือมิติข้อมูล "สัญญา" ขนาดที่ย่อของ lhs
และ rhs
ต้องมีขนาดเท่ากัน ในทางปฏิบัติ สามารถใช้เพื่อสร้างผลคูณแบบจุดระหว่างเวกเตอร์ การคูณเวกเตอร์/เมทริกซ์ หรือการคูณเมทริกซ์/เมทริกซ์
DotGeneral
ดูเพิ่มเติมที่
XlaBuilder::DotGeneral
DotGeneral(lhs, rhs, dimension_numbers)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs |
XlaOp |
อาร์เรย์ประเภท T |
rhs |
XlaOp |
อาร์เรย์ประเภท T |
dimension_numbers |
DotDimensionNumbers |
ตัวเลขมิติข้อมูลการทำสัญญาและแบบกลุ่ม |
คล้ายกับจุด แต่อนุญาตให้ระบุหมายเลขมิติข้อมูลการทำสัญญาและแบบกลุ่มสำหรับทั้ง lhs
และ rhs
ช่อง DotDimensionNumbers | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs_contracting_dimensions
|
int64 ซ้ำ | หมายเลขมิติข้อมูลการทำสัญญา lhs รายการ |
rhs_contracting_dimensions
|
int64 ซ้ำ | หมายเลขมิติข้อมูลการทำสัญญา rhs รายการ |
lhs_batch_dimensions
|
int64 ซ้ำ | หมายเลขมิติข้อมูลกลุ่ม lhs รายการ |
rhs_batch_dimensions
|
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] | แบทช์ แมทมูล |
[b0, b1, m, k] dot [b0, b1, k, n] |
[b0, b1, m, n] | แบทช์ แมทมูล |
ตามหลังหมายเลขมิติข้อมูลที่ได้เริ่มต้นด้วยมิติข้อมูลกลุ่ม จากนั้นเป็นมิติข้อมูลแบบไม่ทำสัญญา/ไม่ใช่กลุ่ม lhs
และสุดท้ายคือมิติข้อมูล rhs
ที่ไม่มีการทำสัญญา/ไม่ใช่กลุ่ม
DynamicSlice
ดูเพิ่มเติมที่
XlaBuilder::DynamicSlice
DynamicSlice จะแยกอาร์เรย์ย่อยจากอาร์เรย์อินพุตที่ start_indices
แบบไดนามิก ระบบจะส่งขนาดของชิ้นส่วนในแต่ละมิติข้อมูลใน size_indices
ซึ่งระบุจุดสิ้นสุดของช่วงส่วนแบ่งพิเศษในแต่ละมิติข้อมูล: [start, start + size) รูปร่างของ start_indices
ต้องมีอันดับ ==
1 โดยมีขนาดมิติข้อมูลเท่ากับอันดับของ operand
DynamicSlice(operand, start_indices, size_indices)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติของประเภท T |
start_indices |
ลำดับ N XlaOp |
รายการจำนวนเต็มสเกลาร์ N ที่มีดัชนีเริ่มต้นของสไลซ์สำหรับแต่ละมิติข้อมูล ค่าต้องมากกว่าหรือเท่ากับ 0 |
size_indices |
ArraySlice<int64> |
รายการจำนวนเต็ม N รายการที่มีขนาดชิ้นส่วนของแต่ละมิติข้อมูล แต่ละค่าต้องมากกว่า 0 เสมอ และเริ่มต้น + ขนาดต้องน้อยกว่าหรือเท่ากับขนาดของมิติข้อมูลเพื่อหลีกเลี่ยงการรวมขนาดมิติข้อมูลมอดูโล |
ดัชนีส่วนแบ่งที่มีประสิทธิภาพจะคำนวณโดยใช้การเปลี่ยนรูปแบบต่อไปนี้สำหรับดัชนี i
แต่ละรายการใน [1, N)
ก่อนดำเนินการแบ่งส่วน:
start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - size_indices[i])
วิธีนี้ช่วยให้มั่นใจว่าชิ้นส่วนที่ดึงข้อมูลจะอยู่ในขอบเขตที่สัมพันธ์กับอาร์เรย์ตัวถูกดำเนินการเสมอ หากสไลซ์อยู่ในขอบเขตก่อนที่จะใช้การเปลี่ยนรูปแบบ การเปลี่ยนรูปแบบจะไม่มีผล
ตัวอย่าง 1 มิติ:
let a = {0.0, 1.0, 2.0, 3.0, 4.0}
let s = {2}
DynamicSlice(a, s, {2}) produces:
{2.0, 3.0}
ตัวอย่าง 2 มิติ:
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}) produces:
{ { 7.0, 8.0},
{10.0, 11.0} }
DynamicUpdateSlice
ดูเพิ่มเติมที่
XlaBuilder::DynamicUpdateSlice
DynamicUpdateSlice สร้างผลลัพธ์ซึ่งเป็นค่าของอาร์เรย์อินพุต operand
โดยมีการเขียนทับ update
ชิ้นส่วนที่ start_indices
รูปร่างของ update
จะกำหนดรูปร่างของอาร์เรย์ย่อยของผลลัพธ์ที่อัปเดต
รูปร่างของ start_indices
ต้องมีอันดับ == 1 โดยมีขนาดมิติข้อมูลเท่ากับอันดับของ operand
DynamicUpdateSlice(operand, update, start_indices)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติของประเภท T |
update |
XlaOp |
อาร์เรย์มิติข้อมูล N ของประเภท T ที่มีการอัปเดตส่วนแบ่ง มิติข้อมูลแต่ละรายการของรูปร่างการอัปเดตต้องมากกว่า 0 และการเริ่มต้น + อัปเดตต้องน้อยกว่าหรือเท่ากับขนาดตัวถูกดำเนินการสำหรับแต่ละมิติข้อมูลเพื่อหลีกเลี่ยงการสร้างดัชนีการอัปเดตที่อยู่นอกขอบเขต |
start_indices |
ลำดับ N XlaOp |
รายการจำนวนเต็มสเกลาร์ N ที่มีดัชนีเริ่มต้นของสไลซ์สำหรับแต่ละมิติข้อมูล ค่าต้องมากกว่าหรือเท่ากับ 0 |
ดัชนีส่วนแบ่งที่มีประสิทธิภาพจะคำนวณโดยใช้การเปลี่ยนรูปแบบต่อไปนี้สำหรับดัชนี i
แต่ละรายการใน [1, N)
ก่อนดำเนินการแบ่งส่วน:
start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - update.dimension_size[i])
วิธีนี้ช่วยให้มั่นใจว่าส่วนแบ่งที่อัปเดตจะอยู่ในขอบเขตที่สัมพันธ์กับอาร์เรย์ตัวถูกดำเนินการเสมอ หากสไลซ์อยู่ในขอบเขตก่อนที่จะใช้การเปลี่ยนรูปแบบ การเปลี่ยนรูปแบบจะไม่มีผล
ตัวอย่าง 1 มิติ:
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) produces:
{0.0, 1.0, 5.0, 6.0, 4.0}
ตัวอย่าง 2 มิติ:
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) produces:
{ {0.0, 1.0, 2.0},
{3.0, 12.0, 13.0},
{6.0, 14.0, 15.0},
{9.0, 16.0, 17.0} }
การดำเนินการทางคณิตศาสตร์ไบนารีตามองค์ประกอบ
ดูเพิ่มเติมที่
XlaBuilder::Add
รองรับชุดการดำเนินการทางคณิตศาสตร์ที่พิจารณาตามองค์ประกอบ
Op(lhs, rhs)
โดยที่ Op
เป็นหนึ่งใน Add
(การเพิ่ม), Sub
(การลบ), Mul
(การคูณ), Div
(การหาร), Rem
(คงเหลือ), Max
(สูงสุด), Min
(ขั้นต่ำ), LogicalAnd
(ตรรกะ AND) หรือ LogicalOr
(ตรรกะ OR)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs |
XlaOp |
ตัวถูกดำเนินการด้านซ้าย: อาร์เรย์ประเภท T |
rhs |
XlaOp |
ตัวถูกดำเนินการด้านขวา: อาร์เรย์ประเภท T |
รูปร่างของอาร์กิวเมนต์ต้องคล้ายกันหรือใช้ร่วมกันได้ ดูเอกสารประกอบของการออกอากาศเกี่ยวกับความหมายของรูปร่างที่เข้ากันได้ ผลลัพธ์ของการดำเนินการจะมีรูปร่างที่เกิดจากการเผยแพร่อาร์เรย์อินพุต 2 รายการ ในตัวแปรนี้ ระบบจะไม่รองรับการดำเนินการระหว่างอาร์เรย์ที่มีอันดับที่ต่างกัน เว้นแต่ตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นสเกลาร์
เมื่อ Op
เป็น Rem
เครื่องหมายของผลลัพธ์จะนำมาจากตัวตั้งหาร และค่าสัมบูรณ์ของผลลัพธ์จะน้อยกว่าค่าสัมบูรณ์ของตัวหารเสมอ
การหารจำนวนเต็ม (การหารที่มีเครื่องหมาย/ไม่มีลายเซ็น/เศษเหลือ 0 หรือการหาร/จำนวนที่เหลือของ INT_SMIN
ที่มี -1
) จะสร้างค่าการใช้งานที่กำหนด
มีตัวแปรทางเลือกที่รองรับการออกอากาศในระดับต่างกันสำหรับการดำเนินการต่อไปนี้
Op(lhs, rhs, broadcast_dimensions)
โดยที่ Op
เหมือนกับด้านบน ควรใช้ตัวแปรนี้สำหรับการดำเนินการทางคณิตศาสตร์ระหว่างอาร์เรย์ที่มีอันดับแตกต่างกัน (เช่น การเพิ่มเมทริกซ์ให้กับเวกเตอร์)
ตัวถูกดำเนินการ broadcast_dimensions
ที่เพิ่มเข้ามาคือส่วนหนึ่งของจำนวนเต็มที่ใช้เพื่อขยายอันดับของตัวถูกดำเนินการอันดับต่ำขึ้นจนถึงอันดับของตัวถูกดำเนินการที่มีอันดับสูงกว่า broadcast_dimensions
จะจับคู่ขนาดของรูปร่างอันดับต่ำกับขนาดของรูปร่างที่มีอันดับสูงกว่า ขนาดของรูปร่างที่ขยายที่ไม่ได้จับคู่จะเติมด้วยมิติของขนาด 1 การออกอากาศมิติข้อมูลที่เสื่อมลงแล้วจะเผยแพร่รูปร่างตามมิติข้อมูลที่เสื่อมลงเหล่านี้เพื่อทำให้รูปร่างของตัวถูกดำเนินการทั้งคู่เท่ากัน ระบบอธิบายไว้อย่างละเอียดในหน้าการออกอากาศ
การดำเนินการเปรียบเทียบตามองค์ประกอบ
ดูเพิ่มเติมที่
XlaBuilder::Eq
รองรับชุดการดำเนินการเปรียบเทียบแบบไบนารีตามองค์ประกอบมาตรฐาน โปรดทราบว่าระบบจะใช้ความหมายเปรียบเทียบจุดลอยตัว IEEE 754 แบบมาตรฐานเมื่อเปรียบเทียบประเภทจุดลอยตัว
Op(lhs, rhs)
โดยที่ Op
เป็นหนึ่งใน Eq
(เท่ากับ), Ne
(ไม่เท่ากับ), Ge
(มากกว่าหรือเท่ากับ), Gt
(มากกว่า), Le
(น้อยกว่าหรือเท่ากับ) Lt
(น้อยกว่า) โอเปอเรเตอร์อีกชุดหนึ่ง ได้แก่ EqTotalOrder, NeTotalOrder, GeTotalOrder,
GtTotalOrder, LeTotalOrder และ LtTotalOrder ได้มามีฟังก์ชันการทำงานที่เหมือนกัน
ยกเว้นว่าจะรองรับลำดับรวมมากกว่าจำนวนจุดลอยตัว
โดยการบังคับใช้ -NaN < -Inf < -Finite < -0 < +0 < +NfN
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
lhs |
XlaOp |
ตัวถูกดำเนินการด้านซ้าย: อาร์เรย์ประเภท T |
rhs |
XlaOp |
ตัวถูกดำเนินการด้านขวา: อาร์เรย์ประเภท T |
รูปร่างของอาร์กิวเมนต์ต้องคล้ายกันหรือใช้ร่วมกันได้ ดูเอกสารประกอบของการออกอากาศเกี่ยวกับความหมายของรูปร่างที่เข้ากันได้ ผลลัพธ์ของการดำเนินการจะมีรูปร่างที่เกิดจากการเผยแพร่อาร์เรย์อินพุต 2 รายการด้วยประเภทองค์ประกอบ PRED
ในตัวแปรนี้ ระบบจะไม่รองรับการดำเนินการระหว่างอาร์เรย์ที่มีอันดับต่างๆ กัน เว้นแต่ตัวถูกดำเนินการรายการใดรายการหนึ่งเป็นสเกลาร์
มีตัวแปรทางเลือกที่รองรับการออกอากาศในระดับต่างกันสำหรับการดำเนินการต่อไปนี้
Op(lhs, rhs, broadcast_dimensions)
โดยที่ Op
เหมือนกับด้านบน ควรใช้ตัวแปรนี้สำหรับการดำเนินการเปรียบเทียบระหว่างอาร์เรย์ที่มีอันดับแตกต่างกัน (เช่น การเพิ่มเมทริกซ์ให้กับเวกเตอร์)
ตัวถูกดำเนินการ broadcast_dimensions
เพิ่มเติมคือส่วนหนึ่งของจำนวนเต็มที่ระบุมิติข้อมูลที่จะใช้สำหรับการเผยแพร่ตัวถูกดำเนินการ โปรดดูคำอธิบายโดยละเอียดในหน้าการออกอากาศ
ฟังก์ชันเอกพันธ์ตามองค์ประกอบ
XlaBuilder รองรับฟังก์ชันเอกพจน์ที่อิงตามองค์ประกอบดังต่อไปนี้
Abs(operand)
abs ตามองค์ประกอบ x -> |x|
Ceil(operand)
CEil ตามองค์ประกอบ x -> ⌈x⌉
Cos(operand)
โคไซน์ตามองค์ประกอบ x -> cos(x)
Exp(operand)
เลขชี้กำลังปกติของธาตุ x -> e^x
Floor(operand)
พื้นตามองค์ประกอบ x -> ⌊x⌋
Imag(operand)
ส่วนจินตภาพของส่วนจินตภาพของรูปร่างที่ซับซ้อน (หรือจริง) x -> imag(x)
. หากตัวถูกดำเนินการเป็นประเภทจุดทศนิยม จะแสดงผลเป็น 0
IsFinite(operand)
ทดสอบว่าองค์ประกอบแต่ละรายการของ operand
มีจำกัดหรือไม่ กล่าวคือ ไม่ใช่ค่าอนันต์ที่เป็นบวกหรือลบ และไม่ใช่ NaN
แสดงผลอาร์เรย์ของค่า PRED
ที่มีรูปทรงเดียวกับอินพุต โดยแต่ละองค์ประกอบมีค่า true
หากองค์ประกอบอินพุตที่สอดคล้องกันมีจํานวนจำกัดเท่านั้น
Log(operand)
ลอการิทึมธรรมชาติที่อิงองค์ประกอบ x -> ln(x)
LogicalNot(operand)
ตรรกะตามองค์ประกอบ ไม่ใช่ x -> !(x)
Logistic(operand)
การคำนวณฟังก์ชันลอจิสติกส์แบบ Element-wise x ->
logistic(x)
PopulationCount(operand)
คำนวณจำนวนบิตที่ตั้งค่าไว้ในแต่ละองค์ประกอบของ operand
Neg(operand)
การปฏิเสธตามองค์ประกอบ x -> -x
Real(operand)
ส่วนจริงตามองค์ประกอบของรูปร่างที่ซับซ้อน (หรือจริง)
x -> real(x)
. หากตัวถูกดำเนินการเป็นประเภทจุดลอยตัว จะแสดงผลค่าเดียวกัน
Rsqrt(operand)
การกลับด้านตามองค์ประกอบจากการดำเนินการรากที่สอง
x -> 1.0 / sqrt(x)
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
Sqrt(operand)
การดำเนินการรากที่สองตามองค์ประกอบ x -> sqrt(x)
Cbrt(operand)
การดำเนินการรากลูกบาศก์ตามองค์ประกอบ x -> cbrt(x)
Tanh(operand)
ไฮเปอร์โบลิกแทนเจนต์แบบ Element-wise x -> tanh(x)
Round(operand)
การปัดเศษตามองค์ประกอบ ให้เสมอกันที่มีค่าเท่ากับ 0
RoundNearestEven(operand)
การปัดเศษตามองค์ประกอบ โดยสัมพันธ์กับเลขคู่ที่ใกล้เคียงที่สุด
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
ตัวถูกดำเนินการของฟังก์ชัน |
ฟังก์ชันนี้จะใช้กับแต่ละองค์ประกอบในอาร์เรย์ operand
ซึ่งทำให้เกิดอาร์เรย์ที่มีรูปร่างเหมือนกัน อนุญาตให้ใช้ operand
เป็นสเกลาร์ (อันดับ 0)
Fft
การดำเนินการ XLA FFT จะนำการแปลงฟูรีเยแบบไปข้างหน้าและผกผันสำหรับอินพุต/เอาต์พุตจริงและที่ซับซ้อน สนับสนุน FFT แบบหลายมิติบนแกนสูงสุด 3 แกน
ดูเพิ่มเติมที่
XlaBuilder::Fft
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
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] เป็นค่าที่ไม่ใช่ 0 โดยละเว้นส่วนสังยุคย้อนกลับของสัญญาณที่มีการแปลงนอกเหนือจากความถี่ Nyquist |
IRFFT |
FFT แบบผกผันจริงไปจนถึงความซับซ้อน (กล่าวคือ ใช้ค่าที่ซับซ้อน แสดงผลจริง) รูปร่างของแกนด้านในสุดจะขยายเป็น fft_length[-1] หาก fft_length[-1] เป็นค่าที่ไม่ใช่ 0 โดยอนุมานส่วนของสัญญาณที่มีการเปลี่ยนรูปแบบนอกเหนือจากความถี่ไนควิสต์จากสังยุคย้อนกลับของรายการ 1 เป็น fft_length[-1] // 2 + 1 |
FFT แบบหลายมิติ
เมื่อระบุ fft_length
มากกว่า 1 รายการ จะเทียบเท่ากับการใช้การเรียงซ้อนของการดำเนินการ FFT กับแกนด้านในสุดแต่ละแกน โปรดทราบว่าสำหรับกรณีจริงที่ซับซ้อนและซับซ้อน->การเปลี่ยนแปลงของแกนด้านในสุดจะเป็นการดำเนินการก่อน (RFFT) เป็นอันดับแรก (RFFT) ส่วนสุดท้ายสำหรับ IRFFT) ซึ่งเป็นสาเหตุที่แกนด้านในสุดเป็นแกนที่เปลี่ยนขนาด การเปลี่ยนแกนอื่นๆ ก็จะ
ซับซ้อน->ซับซ้อน
รายละเอียดการใช้งาน
CPU FFT ได้รับการสนับสนุนโดย TensorFFT ของ Eigen GPU FFT ใช้ cuFFT
รวบรวม
XLA จะรวมการดำเนินการที่ต่อเข้ากับชิ้นส่วนหลายชิ้น (แต่ละชิ้นโดยมีออฟเซ็ตรันไทม์แตกต่างกัน) ของอาร์เรย์อินพุต
อรรถศาสตร์ทั่วไป
ดูเพิ่มเติมที่
XlaBuilder::Gather
สำหรับคำอธิบายที่เข้าใจง่ายขึ้น โปรดดูส่วน "คำอธิบายอย่างไม่เป็นทางการ" ด้านล่าง
gather(operand, start_indices, offset_dims, collapsed_slice_dims, slice_sizes, start_index_map)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ที่เรารวบรวม |
start_indices |
XlaOp |
อาร์เรย์ที่มีดัชนีเริ่มต้นของส่วนที่เรารวบรวม |
index_vector_dim |
int64 |
มิติข้อมูลใน start_indices ที่ "มี" ดัชนีเริ่มต้น โปรดดูคำอธิบายโดยละเอียดด้านล่าง |
offset_dims |
ArraySlice<int64> |
ชุดของขนาดในรูปร่างเอาต์พุตที่ออฟเซ็ตเป็นอาร์เรย์ที่แบ่งตามตัวถูกดำเนินการ |
slice_sizes |
ArraySlice<int64> |
slice_sizes[i] คือขอบเขตของสไลซ์ในมิติข้อมูล i |
collapsed_slice_dims |
ArraySlice<int64> |
ชุดของมิติข้อมูลในแต่ละสไลซ์ที่ยุบหายไป มิติข้อมูลเหล่านี้ต้องมีขนาด 1 |
start_index_map |
ArraySlice<int64> |
แผนที่ที่อธิบายวิธีจับคู่ดัชนีใน start_indices กับดัชนีกฎหมายลงในตัวถูกดำเนินการ |
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
จะได้รับการคำนวณดังนี้
หากมี
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
] หากไม่เป็นเช่นนั้น)หาก
i
แสดงในoffset_dims
(นั่นคือเท่ากับoffset_dims
[k
] สำหรับk
บางk
) เราจะเลือกขอบเขตที่เกี่ยวข้องจากslice_sizes
หลังจากคำนวณcollapsed_slice_dims
(นั่นคือ เราเลือกadjusted_slice_sizes
[k
] โดยที่adjusted_slice_sizes
เป็นslice_sizes
โดยนำขอบเขตในดัชนีcollapsed_slice_dims
ออก)
อย่างเป็นทางการ ดัชนีตัวถูกดำเนินการ In
ที่สอดคล้องกับดัชนีเอาต์พุต Out
หนึ่งๆ จะคำนวณดังนี้
ให้
G
= {Out
[k
] สําหรับk
ในbatch_dims
} ใช้G
เพื่อตัดเวกเตอร์S
ออก เพื่อให้S
[i
] =start_indices
[รวม(G
,i
)] โดยที่ รวม(A, b) แทรก b ที่ตำแหน่งindex_vector_dim
ลงใน A โปรดทราบว่าข้อมูลนี้ได้รับการกำหนดไว้อย่างดีแม้G
จะว่างเปล่า หากG
ว่างเปล่า ให้S
=start_indices
สร้างดัชนีเริ่มต้น
S
in
ลงในoperand
โดยใช้S
โดยกระจายS
ด้วยstart_index_map
แม่นยำยิ่งขึ้น:S
in
[start_index_map
[k
]] =S
[k
] หากk
<start_index_map.size
S
in
[_
] =0
หากไม่เป็นเช่นนั้น
สร้างดัชนี
O
in
ลงในoperand
โดยกระจายดัชนีที่มิติข้อมูลออฟเซ็ตในOut
ตามชุดcollapsed_slice_dims
แม่นยำยิ่งขึ้น:O
in
[remapped_offset_dims
(k
)] =Out
[offset_dims
[k
]] หากk
<offset_dims.size
(remapped_offset_dims
กำหนดไว้ด้านล่าง)O
in
[_
] =0
หากไม่เป็นเช่นนั้น
In
คือO
in
+S
in
โดยที่ + เป็นการบวกตามองค์ประกอบ
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
เท่ากับ {0
→1
,
1
→3
, 2
→4
, 3
→5
}
หากตั้งค่า indices_are_sorted
เป็น "จริง" 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.rank
- 1
ในตัวอย่างทั้งหมดที่ตามมา ค่าที่น่าสนใจอื่นๆ สำหรับ index_vector_dim
จะไม่เปลี่ยนแปลงการดำเนินการโดยพื้นฐาน แต่ทำให้การนำเสนอด้วยภาพดูยุ่งยากมากขึ้น
หากต้องการทราบความเข้าใจว่าองค์ประกอบที่กล่าวมาทั้งหมดทำงานร่วมกันอย่างไร มาดูตัวอย่างที่รวบรวมรูปร่าง [8,6]
ไว้ 5 ส่วนจากอาร์เรย์ [16,11]
ตำแหน่งของสไลซ์ลงในอาร์เรย์ [16,11]
อาจแสดงเป็นเวกเตอร์ดัชนีของรูปร่าง S64[2]
ได้ ดังนั้นชุด 5 ตำแหน่งจึงแสดงเป็นอาร์เรย์ S64[5,2]
ได้
จากนั้นลักษณะการทำงานของการดำเนินการรวบรวมอาจแสดงเป็นการเปลี่ยนรูปแบบดัชนีที่ใช้ [G
,O
0
,O
1
] ซึ่งเป็นดัชนีในรูปร่างเอาต์พุต แล้วแมปกับองค์ประกอบในอาร์เรย์อินพุตในลักษณะต่อไปนี้
ก่อนอื่นเราเลือกเวกเตอร์ (X
,Y
) จากอาร์เรย์ดัชนีรวบรวมโดยใช้ G
องค์ประกอบในอาร์เรย์เอาต์พุตที่ดัชนี [G
,O
0
,O
1
] จะเป็นองค์ประกอบในอาร์เรย์อินพุตที่ดัชนี [X
+O
0
,Y
+O
1
]
slice_sizes
คือ [8,6]
ซึ่งจะกำหนดช่วงของ O0
และ O1
จากนั้นจะกำหนดขอบเขตของส่วนแบ่ง
การดำเนินการรวบรวมนี้จะทำหน้าที่เป็นสไลซ์แบบไดนามิกแบบกลุ่มที่มี G
เป็นมิติข้อมูลกลุ่ม
ดัชนีที่รวบรวมอาจมีหลายมิติ เช่น เวอร์ชันทั่วไปจากตัวอย่างด้านบนที่ใช้อาร์เรย์ "gather indices" ของรูปร่าง [4,5,2]
จะแปลค่าดัชนีดังนี้
ซึ่งจะทำหน้าที่เป็นสไลซ์แบบไดนามิกแบบกลุ่ม G
0
และ
G
1
เป็นมิติข้อมูลกลุ่ม ขนาดของชิ้นส่วนยังคงเป็น [8,6]
การดำเนินการรวบรวมใน XLA จะสร้างเสริมความหมายอย่างไม่เป็นทางการที่ระบุไว้ข้างต้นในลักษณะต่อไปนี้
เราสามารถกำหนดค่าได้ว่ามิติข้อมูลใดในรูปร่างเอาต์พุตจะเป็นมิติข้อมูลออฟเซ็ต (มิติข้อมูลที่มี
O
0
,O
1
ในตัวอย่างสุดท้าย) มิติข้อมูลกลุ่มเอาต์พุต (มิติข้อมูลที่มีG
0
,G
1
ในตัวอย่างสุดท้าย) ได้รับการกำหนดให้เป็นมิติข้อมูลเอาต์พุตที่ไม่ใช่มิติข้อมูลออฟเซ็ตจำนวนของขนาดออฟเซ็ตเอาต์พุตที่แสดงอย่างชัดเจนในรูปร่างเอาต์พุตอาจน้อยกว่าอันดับอินพุต มิติข้อมูลที่ "ขาดหายไป" เหล่านี้ซึ่งแสดงอย่างชัดเจนว่าเป็น
collapsed_slice_dims
จะต้องมีขนาดชิ้นส่วนเป็น1
เนื่องจากมีขนาดส่วนแบ่ง1
ดัชนีเดียวที่ใช้ได้คือ0
และการละเว้นก็ไม่ทำให้เกิดความกำกวมสไลซ์ที่ดึงมาจากอาร์เรย์ "รวบรวมดัชนี" ((
X
,Y
) ในตัวอย่างสุดท้าย) อาจมีองค์ประกอบน้อยกว่าอันดับของอาร์เรย์อินพุต และการแมปที่ชัดเจนจะกำหนดวิธีขยายดัชนีให้มีอันดับเดียวกันกับอินพุต
ตัวอย่างสุดท้าย เราใช้ (2) และ (3) ในการใช้งาน tf.gather_nd
ดังนี้
G
0
และ G
1
จะใช้เพื่อแยกดัชนีเริ่มต้นออกจากอาร์เรย์ดัชนีรวบรวมตามปกติ ยกเว้นดัชนีเริ่มต้นจะมีองค์ประกอบเพียงองค์ประกอบเดียว ซึ่งก็คือ X
ในทำนองเดียวกัน มีดัชนีออฟเซ็ตเอาต์พุตเพียงค่าเดียวที่มีค่า O
0
อย่างไรก็ดี ก่อนที่จะใช้เป็นดัชนีในอาร์เรย์อินพุต
1 พารามิเตอร์จะถูกขยายตาม "1 รวบรวมการแมปดัชนี" (start_index_map
ใน
คำอธิบายอย่างเป็นทางการ) และ "การแมปออฟเซต" (remapped_offset_dims
ในคำอธิบายอย่างเป็นทางการ) ลงใน [X
,0
] และ [0
,O
0
] ตามลำดับ โดยเพิ่มเป็น [X
,O
0
] ตามลำดับ กล่าวอีกนัยหนึ่งคือ [X
,O
/0
] กล่าวคือ [}{/2] ดัชนี[}{/[G
] ดัชนี [}{/2]G
0
0
0
0
O
G
G
1
1
GatherIndices
tf.gather_nd
slice_sizes
สำหรับเคสนี้คือ [1,11]
ซึ่งหมายความว่า X
ดัชนีทั้งหมดในอาร์เรย์ดัชนีรวบรวมจะเลือกทั้งแถว และผลลัพธ์คือการรวมแถวเหล่านี้ทั้งหมดเข้าด้วยกัน
GetDimensionSize
ดูเพิ่มเติมที่
XlaBuilder::GetDimensionSize
แสดงขนาดของตัวถูกดำเนินการที่ระบุ ตัวถูกดำเนินการ จะต้องเป็นรูปอาร์เรย์
GetDimensionSize(operand, dimension)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์อินพุตมิติ n |
dimension |
int64 |
ค่าในช่วง [0, n) ที่ระบุมิติข้อมูล |
SetDimensionSize
ดูเพิ่มเติมที่
XlaBuilder::SetDimensionSize
ตั้งค่าขนาดแบบไดนามิกของมิติข้อมูลที่ระบุของ XlaOp ตัวถูกดำเนินการ จะต้องเป็นรูปอาร์เรย์
SetDimensionSize(operand, size, dimension)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
n อาร์เรย์อินพุตมิติ |
size |
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);
GetTupleElement
ดูเพิ่มเติมที่
XlaBuilder::GetTupleElement
จัดทำดัชนีเป็น Tuple ที่มีค่าคงที่เวลาคอมไพล์
ค่าจะต้องเป็นค่าคงที่เวลาคอมไพล์เพื่อให้อนุมานรูปร่างสามารถกำหนดประเภทของค่าผลลัพธ์ได้
ค่านี้เทียบเคียงกับ 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
เพิ่มเติม
ในฟีด
ดูเพิ่มเติมที่
XlaBuilder::Infeed
Infeed(shape)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
shape |
Shape |
รูปร่างของข้อมูลที่อ่านจากอินเทอร์เฟซในฟีด ต้องตั้งช่องเลย์เอาต์ของรูปร่างให้ตรงกับเลย์เอาต์ของข้อมูลที่ส่งไปยังอุปกรณ์ มิเช่นนั้นจะไม่มีการกำหนดลักษณะการทำงาน |
อ่านรายการข้อมูลเดียวจากอินเทอร์เฟซสตรีมมิงในฟีดแบบไม่เจาะจงปลายทางของอุปกรณ์ โดยตีความข้อมูลเป็นรูปร่างและเลย์เอาต์ที่ระบุ แล้วแสดงผล XlaOp
ของข้อมูล อนุญาตให้ใช้การดำเนินการในฟีดหลายรายการในการคำนวณได้ แต่ต้องมีลำดับรวมของการดำเนินการในฟีด ตัวอย่างเช่น โฆษณาในฟีด 2 รายการในโค้ดด้านล่างมีลำดับทั้งหมด เนื่องจากมีความเกี่ยวข้องระหว่างลูปขณะ
result1 = while (condition, init = init_value) {
Infeed(shape)
}
result2 = while (condition, init = result1) {
Infeed(shape)
}
ไม่รองรับรูปร่างกระจัดกระจายซ้อนกัน สำหรับรูปร่าง Tuple ที่ว่างเปล่า การดำเนินการในฟีดจะเป็นแบบไม่มีการดำเนินการและดำเนินต่อไปอย่างมีประสิทธิภาพ โดยไม่ต้องอ่านข้อมูลจาก Infeed ของอุปกรณ์
Iota
ดูเพิ่มเติมที่
XlaBuilder::Iota
Iota(shape, iota_dimension)
สร้างลิเทอรัลคงที่ในอุปกรณ์แทนการโอนโฮสต์ขนาดใหญ่ สร้างอาร์เรย์ที่ระบุรูปร่างและมีค่าเริ่มต้นที่ 0 และเพิ่มทีละ 1 ตามมิติข้อมูลที่ระบุ สำหรับประเภทจุดลอยตัว อาร์เรย์ที่สร้างขึ้นจะเทียบเท่ากับ ConvertElementType(Iota(...))
โดยที่ Iota
เป็นประเภทปริพันธ์และ Conversion เป็นประเภทจุดลอยตัว
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
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 ]]
แผนที่
ดูเพิ่มเติมที่
XlaBuilder::Map
Map(operands..., computation)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operands |
ลำดับ N XlaOp วินาที |
N อาร์เรย์ของประเภท T0..T{N-1} |
computation |
XlaComputation |
การคำนวณประเภท T_0, T_1, .., T_{N + M -1} -> S ที่มีพารามิเตอร์ N ประเภท T และ M ในประเภทที่กำหนดเอง |
dimensions |
อาร์เรย์ int64 |
อาร์เรย์ของขนาดแผนที่ |
ใช้ฟังก์ชันสเกลาร์กับอาร์เรย์ operands
ที่ระบุ ซึ่งจะสร้างอาร์เรย์ที่มีขนาดเท่ากัน โดยแต่ละองค์ประกอบเป็นผลลัพธ์ของฟังก์ชันที่แมป ซึ่งใช้กับองค์ประกอบที่สัมพันธ์กันในอาร์เรย์อินพุต
ฟังก์ชันที่แมปเป็นการคำนวณที่กำหนดเองซึ่งมีข้อจำกัดว่าฟังก์ชันมีอินพุต N อินพุตของประเภทสเกลาร์ T
และเอาต์พุตเดียวที่เป็นประเภท S
เอาต์พุตจะมีขนาดเท่ากับตัวถูกดำเนินการ เว้นแต่ว่าองค์ประกอบประเภท T จะถูกแทนที่ด้วย S
เช่น Map(op1, op2, op3, computation, par1)
แมป elem_out <-
computation(elem1, elem2, elem3, par1)
ที่ดัชนี (แบบหลายมิติ) แต่ละรายการในอาร์เรย์อินพุตเพื่อสร้างอาร์เรย์เอาต์พุต
OptimizationBarrier
บล็อกคะแนนการเพิ่มประสิทธิภาพไม่ให้ย้ายการคำนวณข้ามอุปสรรคนั้น
ดูแลให้อินพุตทั้งหมดได้รับการประเมินก่อนโอเปอเรเตอร์ใดๆ ที่ขึ้นอยู่กับเอาต์พุตของอุปสรรค
แผ่นซับน้ำนม
ดูเพิ่มเติมที่
XlaBuilder::Pad
Pad(operand, padding_value, padding_config)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ประเภท T |
padding_value |
XlaOp |
สเกลาร์ของประเภท T เพื่อเติมระยะห่างจากขอบที่เพิ่มเข้ามา |
padding_config |
PaddingConfig |
ระยะห่างจากขอบทั้ง 2 ด้าน (ต่ำ, สูง) และระหว่างองค์ประกอบของมิติข้อมูลแต่ละรายการ |
ขยายอาร์เรย์ operand
ที่ระบุโดยใช้ระยะห่างจากขอบรอบๆ อาร์เรย์ รวมถึงระหว่างองค์ประกอบของอาร์เรย์ที่มี padding_value
ที่ระบุ padding_config
ระบุระยะห่างจากขอบและระยะห่างภายในสำหรับแต่ละมิติข้อมูล
PaddingConfig
เป็นช่องที่ซ้ำของ PaddingConfigDimension
ซึ่งมี 3 ช่องสำหรับแต่ละมิติข้อมูล ได้แก่ edge_padding_low
, edge_padding_high
และ interior_padding
edge_padding_low
และ edge_padding_high
จะระบุจำนวนระยะห่างจากขอบที่เพิ่มลงในระดับล่าง (ข้างดัชนี 0) และระดับไฮเอนด์ (ถัดจากดัชนีสูงสุด) ของแต่ละมิติข้อมูลตามลำดับ ระยะห่างจากขอบอาจเป็นค่าลบได้ ค่าสัมบูรณ์ของระยะห่างจากขอบเชิงลบจะระบุจำนวนองค์ประกอบที่จะนำออกจากมิติข้อมูลที่ระบุ
interior_padding
ระบุจำนวนระยะห่างจากขอบที่เพิ่มระหว่างองค์ประกอบ 2 รายการในแต่ละมิติข้อมูล ค่าต้องไม่เป็นค่าลบ ระยะห่างจากขอบภายในจะเกิดขึ้นอย่างสมเหตุสมผลก่อนระยะห่างจากขอบ ดังนั้นในกรณีที่มีระยะห่างจากขอบที่เป็นลบ องค์ประกอบจะถูกนำออกจากตัวถูกดำเนินการที่เสริมภายใน
การดำเนินการนี้จะถือว่าไม่มีการดำเนินการหากคู่ระยะห่างจากขอบเป็น 0 ทั้งหมด (0, 0) และค่าระยะห่างจากขอบภายในเป็น 0 ทั้งหมด ภาพด้านล่างแสดงตัวอย่างของค่า edge_padding
และ interior_padding
ที่แตกต่างกันสำหรับอาร์เรย์ 2 มิติ
รับ
ดูเพิ่มเติมที่
XlaBuilder::Recv
Recv(shape, channel_handle)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
shape |
Shape |
รูปร่างของข้อมูลที่จะรับ |
channel_handle |
ChannelHandle |
ตัวระบุที่ไม่ซ้ำกันสำหรับคู่การส่ง/รับแต่ละคู่ |
รับข้อมูลของรูปร่างที่ระบุจากคำสั่ง Send
ในการคำนวณอื่นที่ใช้แฮนเดิลของช่องเดียวกัน แสดงผล
XlaOp สำหรับข้อมูลที่ได้รับ
ไคลเอ็นต์ API ของการดำเนินการ Recv
แสดงถึงการสื่อสารแบบพร้อมกัน
แต่วิธีการจะแบ่งออกเป็นคำสั่ง HLO จำนวน 2 คำสั่ง (Recv
และ RecvDone
) ภายในเพื่อเปิดใช้การโอนข้อมูลแบบไม่พร้อมกัน ดู HloInstruction::CreateRecv
และ HloInstruction::CreateRecvDone
เพิ่มเติม
Recv(const Shape& shape, int64 channel_id)
จัดสรรทรัพยากรที่จำเป็นต่อการรับข้อมูลจากคำสั่ง Send
ที่มี channel_id เดียวกัน แสดงผลบริบทสำหรับทรัพยากรที่จัดสรร ซึ่งจะใช้โดยคำสั่ง RecvDone
ต่อไปนี้เพื่อรอให้การโอนข้อมูลเสร็จสมบูรณ์ บริบทเป็น Tuple ของ {receiveบัฟเฟอร์ (shape), ตัวระบุคำขอ (U32)} และใช้ได้ในคำสั่ง RecvDone
เท่านั้น
RecvDone(HloInstruction context)
เนื่องจากมีบริบทที่สร้างโดยคำสั่ง Recv
โปรดรอให้การโอนข้อมูลเสร็จสมบูรณ์และแสดงผลข้อมูลที่ได้รับ
ลด (Reduce)
ดูเพิ่มเติมที่
XlaBuilder::Reduce
ใช้ฟังก์ชันการลดกับอาร์เรย์อย่างน้อย 1 รายการพร้อมกัน
Reduce(operands..., init_values..., computation, dimensions)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
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 |
อาร์เรย์ int64 |
อาร์เรย์ของมิติข้อมูลที่ไม่เรียงลำดับที่จะลด |
โดยที่
- ต้องมี N มากกว่าหรือเท่ากับ 1
- การคำนวณจะต้องเชื่อมโยงกัน "โดยประมาณ" (ดูด้านล่าง)
- อาร์เรย์อินพุตทั้งหมดต้องมีขนาดเท่ากัน
- ค่าเริ่มต้นทั้งหมดต้องสร้างข้อมูลประจำตัวภายใต้
computation
- หากเป็น
N = 1
Collate(T)
จะเท่ากับT
- หาก
N > 1
Collate(T_0, ..., T_{N-1})
จะเป็น Tuple ขององค์ประกอบN
ประเภทT
การดำเนินการนี้จะลดขนาดของอาร์เรย์อินพุตแต่ละรายการเป็นสเกลาร์
อันดับของอาร์เรย์ที่แสดงผลแต่ละรายการคือ rank(operand) - len(dimensions)
เอาต์พุตของการดำเนินการคือ Collate(Q_0, ..., Q_N)
โดยที่ Q_i
คืออาร์เรย์ประเภท T_i
โดยมีมิติข้อมูลตามที่อธิบายไว้ด้านล่าง
แบ็กเอนด์ต่างๆ ได้รับอนุญาตให้เชื่อมโยงการคำนวณการลดนี้อีกครั้ง ความแตกต่างนี้อาจทำให้เกิดความแตกต่างด้านตัวเลขได้ เนื่องจากฟังก์ชันการลดทอนบางอย่าง เช่น การเพิ่ม ไม่เกี่ยวข้องกับฟังก์ชันแบบลอย อย่างไรก็ตาม หากช่วงข้อมูลมีจำกัด การเพิ่มจุดลอยตัวก็ใกล้เคียงพอที่จะเชื่อมโยงได้กับการใช้งานจริงส่วนใหญ่
ตัวอย่าง
เมื่อลดขนาดลงหนึ่งมิติข้อมูลในอาร์เรย์ 1D เดียวที่มีค่า [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 rank 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 มิติ (เมทริกซ์) รูปร่างมีอันดับ 2 ขนาดเป็น 0 ของขนาด 2 และขนาดที่ 1 ของขนาดที่ 3
ผลลัพธ์ของการลดมิติข้อมูล 0 หรือ 1 ด้วยฟังก์ชัน "เพิ่ม"
โปรดทราบว่าผลลัพธ์การลดทั้งสองเป็นอาร์เรย์ 1D แผนภาพนี้แสดงมุมมองหนึ่งเป็นคอลัมน์ และอีกส่วนเป็นแถวเพื่อให้มองเห็นได้สะดวก
สำหรับตัวอย่างที่ซับซ้อนยิ่งขึ้น นี่คืออาร์เรย์ 3 มิติ อันดับของเกมคือ 3 มิติข้อมูลเป็น 0 ของขนาด 4 มิติข้อมูลที่ 1 ของขนาด 2 และขนาดที่ 2 ของขนาด 3 เพื่อให้เข้าใจง่ายขึ้น ระบบจะคัดลอกค่า 1 ถึง 6 ข้ามมิติข้อมูล 0
เช่นเดียวกับตัวอย่าง 2 มิติ เราสามารถลดขนาดเพียงมิติเดียว เช่น หากเราลดมิติข้อมูล 0 เราจะได้รับอาร์เรย์อันดับ-2 ที่ค่าทั้งหมดในมิติข้อมูล 0 ถูกพับเป็นสเกลาร์
| 4 8 12 |
| 16 20 24 |
หากลดมิติข้อมูล 2 เรายังได้รับอาร์เรย์อันดับ 2 ที่พับค่าทั้งหมดในมิติข้อมูล 2 เป็นสเกลาร์ด้วย
| 6 15 |
| 6 15 |
| 6 15 |
| 6 15 |
โปรดทราบว่าระบบจะเก็บลำดับที่เกี่ยวข้องระหว่างมิติข้อมูลที่เหลือในอินพุตไว้ในเอาต์พุต แต่มิติข้อมูลบางรายการอาจได้รับการกำหนดตัวเลขใหม่ (เนื่องจากอันดับมีการเปลี่ยนแปลง)
และยังลดมิติข้อมูลได้อีกด้วย การเพิ่มมิติข้อมูลการลด 0 และ 1 จะสร้างอาร์เรย์ 1 มิติ [20, 28, 36]
การลดอาร์เรย์ 3 มิติในมิติข้อมูลทั้งหมดจะทำให้เกิดสเกลาร์ 84
วาเรียดิก Reduce (Variadic Reduce)
เมื่อใช้ N > 1
แอปพลิเคชันฟังก์ชันลดจะซับซ้อนขึ้นเล็กน้อย เนื่องจากระบบจะนําไปใช้กับอินพุตทั้งหมดพร้อมกัน ระบบจะส่งตัวถูกดำเนินการไปยังการคำนวณตามลำดับต่อไปนี้
- การเรียกใช้ค่าที่ลดลงสำหรับตัวถูกดำเนินการแรก
- ...
- กำลังเรียกใช้ค่าที่ลดลงสำหรับตัวถูกดำเนินการ N
- ค่าที่ป้อนสำหรับตัวถูกดำเนินการแรก
- ...
- ค่าที่ป้อนสำหรับตัวถูกดำเนินการ N
ตัวอย่างเช่น ลองพิจารณาฟังก์ชันการลดต่อไปนี้ ซึ่งสามารถใช้ในการคํานวณค่าสูงสุดและ argmax ของอาร์เรย์ 1-D แบบขนาน
f: (Float, Int, Float, Int) -> Float, Int
f(max, argmax, value, index):
if value >= max:
return (value, index)
else:
return (max, argmax)
สำหรับอาร์เรย์อินพุต 1-D 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) จะทำซ้ำในอาร์เรย์ต่างๆ แล้วแสดงผล Tuple ที่มีค่าสูงสุดและดัชนีที่ตรงกัน
ReducePrecision
ดูเพิ่มเติมที่
XlaBuilder::ReducePrecision
จำลองผลของการแปลงค่าจุดลอยตัวเป็นรูปแบบที่มีความแม่นยำต่ำลง (เช่น IEEE-FP16) และกลับไปเป็นรูปแบบเดิม คุณระบุจำนวนบิตของเลขชี้กำลังและบิตแมนทิสซาในรูปแบบความแม่นยำต่ำได้ตามต้องการ แม้ว่าการใช้งานฮาร์ดแวร์ทั้งหมดอาจไม่รองรับขนาดบิตทั้งหมด
ReducePrecision(operand, mantissa_bits, exponent_bits)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ของประเภทจุดลอยตัว T |
exponent_bits |
int32 |
จำนวนบิตของเลขชี้กำลังในรูปแบบที่มีความแม่นยำต่ำ |
mantissa_bits |
int32 |
จำนวนบิตของตั๊กแตนในรูปแบบความแม่นยำต่ำ |
ผลลัพธ์คืออาร์เรย์ประเภท T
ระบบจะปัดเศษค่าอินพุตให้เป็นค่าที่ใกล้เคียงที่สุดที่แสดงด้วยจำนวนบิตของตั๊กแตน (โดยใช้ความหมายของ "ที่สัมพันธ์กับคู่") และค่าที่เกินช่วงที่ระบุโดยจำนวนบิตของเลขชี้กำลังจะถูกบีบให้อยู่ภายในค่าอนันต์บวกหรือลบ ค่า NaN
จะยังคงอยู่ แม้ว่าอาจแปลงเป็นค่า NaN
Canonical ได้ก็ตาม
รูปแบบที่มีความแม่นยำต่ำต้องมีบิตของเลขชี้กำลังอย่างน้อย 1 บิต (เพื่อแยกค่าศูนย์ออกจากค่าอนันต์ เนื่องจากทั้งสองค่ามีแมนติสซาเป็นศูนย์) และต้องมีจำนวนบิตของมันติสซาที่ไม่เป็นลบ จำนวนบิตของเลขชี้กำลังหรือบิตแมนทิสซาอาจเกินค่าที่เกี่ยวข้องสำหรับประเภท T
ส่วนที่สอดคล้องกันของ Conversion จะเป็นเพียงค่าที่ไม่มีการดำเนินการ
ReduceScatter
ดูเพิ่มเติมที่
XlaBuilder::ReduceScatter
ReduceScatter เป็นการดำเนินการร่วมที่ทำ AllReduce อย่างมีประสิทธิภาพ จากนั้นจึงกระจายผลลัพธ์โดยแยกผลลัพธ์เป็น shard_count
บล็อกตามแนว
scatter_dimension
และการจำลอง i
ในกลุ่มตัวจำลองจะได้รับชาร์ด ith
ReduceScatter(operand, computation, scatter_dim, shard_count,
replica_group_ids, channel_id)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์หรือ Tuple ของอาร์เรย์ที่ไม่ว่างเปล่าที่จะลดตัวจำลอง |
computation |
XlaComputation |
การคํานวณการลด |
scatter_dimension |
int64 |
มิติข้อมูลที่จะกระจาย |
shard_count |
int64 |
จำนวนบล็อกที่จะแยก scatter_dimension |
replica_groups |
เวกเตอร์ของเวกเตอร์ของ int64 |
กลุ่มที่มีการลด |
channel_id |
ไม่บังคับ int64 |
รหัสแชแนลที่ไม่บังคับสำหรับการสื่อสารข้ามโมดูล |
- เมื่อ
operand
เป็น Tuple ของอาร์เรย์ ระบบจะใช้ลดการกระจายกับแต่ละองค์ประกอบของ Tuple replica_groups
คือรายการกลุ่มตัวจำลองที่มีการทำการลด (จะดึงรหัสการจำลองสำหรับตัวจำลองปัจจุบันได้โดยใช้ReplicaId
) ลำดับของตัวจำลองในแต่ละกลุ่มจะกำหนดลำดับที่ผลลัพธ์ที่มีการลดทั้งหมดจะถูกกระจายreplica_groups
ต้องว่างเปล่า (ในกรณีนี้ตัวจำลองทั้งหมดจะเป็นของกลุ่มเดียว) หรือมีองค์ประกอบจำนวนเท่ากับจำนวนตัวจำลอง เมื่อมีกลุ่มตัวจำลองมากกว่า 1 กลุ่ม ทุกกลุ่มต้องมีขนาดเท่ากัน ตัวอย่างเช่นreplica_groups = {0, 2}, {1, 3}
จะทำการลดข้อมูลจำลอง0
กับ2
และ1
กับ3
จากนั้นจึงกระจายผลลัพธ์shard_count
คือขนาดของกลุ่มตัวจำลองแต่ละกลุ่ม เราต้องใช้ค่านี้ในกรณีที่replica_groups
ว่างเปล่า หากreplica_groups
ไม่ว่างเปล่าshard_count
ต้องเท่ากับขนาดของกลุ่มตัวจำลองแต่ละกลุ่มchannel_id
ใช้สำหรับการสื่อสารข้ามโมดูล: มีเพียงการดำเนินการreduce-scatter
ที่มีchannel_id
เดียวกันเท่านั้นที่สื่อสารกันได้
รูปร่างเอาต์พุตคือรูปร่างอินพุตที่มี scatter_dimension
ทำให้เล็กลง shard_count
เท่า ตัวอย่างเช่น ถ้ามีตัวจำลอง 2 ตัวและตัวถูกดำเนินการมีค่า [1.0, 2.25]
และ [3.0, 5.25]
ในข้อมูลจำลอง 2 ตัวตามลำดับ ค่าเอาต์พุตจาก op นี้โดยที่ scatter_dim
คือ 0
จะเป็น [4.0]
สำหรับตัวจำลองแรก และ [7.5]
สำหรับตัวจำลองที่ 2
ReduceWindow
ดูเพิ่มเติมที่
XlaBuilder::ReduceWindow
ใช้ฟังก์ชันการลดกับองค์ประกอบทั้งหมดในแต่ละหน้าต่างของอาร์เรย์หลายมิติข้อมูลตามลำดับ N ลำดับ โดยสร้างชุดอาร์เรย์หลายมิติ N เดียวหรือ 1 ชุดเป็นเอาต์พุต อาร์เรย์เอาต์พุตแต่ละอาร์เรย์มีจำนวนองค์ประกอบเท่ากับจำนวนตำแหน่งที่ถูกต้องของหน้าต่าง เลเยอร์การรวมอาจแสดงเป็น ReduceWindow
เช่นเดียวกับ Reduce
computation
ที่ใช้จะผ่าน init_values
ทางด้านซ้ายเสมอ
ReduceWindow(operands..., init_values..., computation, window_dimensions,
window_strides, padding)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operands |
N XlaOps |
ลำดับของอาร์เรย์หลายมิติ N ของประเภท T_0,..., T_{N-1} โดยแต่ละอาร์เรย์แสดงพื้นที่ฐานที่มีการวางหน้าต่าง |
init_values |
N XlaOps |
ค่าเริ่มต้นของ N สำหรับการลด 1 ค่าต่อตัวถูกดำเนินการ 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> |
อาร์เรย์ของจำนวนเต็มสำหรับค่า Window Stride |
base_dilations |
ArraySlice<int64> |
อาร์เรย์ของจำนวนเต็มสำหรับค่าการขยายฐาน |
window_dilations |
ArraySlice<int64> |
อาร์เรย์ของจำนวนเต็มสำหรับค่าการขยายหน้าต่าง |
padding |
Padding |
ประเภทระยะห่างจากขอบสำหรับหน้าต่าง (แพดดิง::kSame ซึ่งทำให้มีรูปร่างเอาต์พุตเดียวกันกับอินพุตหากก้าวเป็น 1 หรือ Padding::kValid ซึ่งไม่มีระยะห่างจากขอบและ "หยุด" หน้าต่างเมื่อปรับขนาดไม่พอดี) |
โดยที่
- ต้องมี N มากกว่าหรือเท่ากับ 1
- อาร์เรย์อินพุตทั้งหมดต้องมีขนาดเท่ากัน
- หากเป็น
N = 1
Collate(T)
จะเท่ากับT
- หาก
N > 1
Collate(T_0, ..., T_{N-1})
จะเป็น Tuple ขององค์ประกอบN
ประเภท(T0,...T{N-1})
โค้ดและรูปด้านล่างแสดงตัวอย่างการใช้ ReduceWindow
อินพุตคือเมทริกซ์ขนาด [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 ในมิติข้อมูลเป็นการระบุว่าตำแหน่งของหน้าต่างในมิติข้อมูลอยู่ห่างจากหน้าต่างที่อยู่ติดกัน 1 องค์ประกอบ ในการระบุว่าไม่มีหน้าต่างใดทับซ้อนกันอยู่ window_stride_dimensions ควรเท่ากับwindow_dimensions รูปด้านล่างแสดงการใช้ค่าก้าวที่ต่างกัน 2 ก้าว ระยะห่างจากขอบจะใช้กับมิติข้อมูลแต่ละรายการของอินพุต และการคำนวณจะเหมือนกันหากอินพุตมาพร้อมกับมิติข้อมูลที่มีหลังระยะห่างจากขอบ
สำหรับตัวอย่างระยะห่างจากขอบที่ไม่สำคัญ ลองพิจารณาค่าต่ำสุดของกรอบเวลาที่ลดลงในการประมวลผล (ค่าเริ่มต้นคือ MAX_FLOAT
) ด้วยมิติข้อมูล 3
และวางสเตจ 2
บนอาร์เรย์อินพุต [10000, 1000, 100, 10, 1]
การเพิ่มระยะห่างจากขอบ kValid
จะคำนวณขั้นต่ำเกินกรอบเวลาที่ถูกต้อง 2 หน้าต่าง ได้แก่ [10000, 1000, 100]
และ [100, 10, 1]
ซึ่งทําให้ผลลัพธ์เป็น [100, 1]
การเพิ่มระยะขอบ kSame
จะเพิ่มองค์ประกอบแรกไปยังอาร์เรย์เพื่อให้รูปร่างหลังกรอบเวลาการลดเป็นเดียวกับอินพุตสําหรับการเร่งความเร็ว โดยเพิ่มองค์ประกอบเริ่มต้นทั้ง 2 ด้าน แล้วได้ [MAX_VALUE, 10000, 1000, 100, 10, 1,
MAX_VALUE]
การเรียกใช้กรอบเวลาที่ลดลงบนอาร์เรย์ที่มีเบาะจะทำงานบน 3 หน้าต่าง ได้แก่ [MAX_VALUE, 10000, 1000]
, [1000, 100, 10]
, [10, 1, MAX_VALUE]
และผลตอบแทน [1000, 10, 1]
ลำดับการประเมินของฟังก์ชันการลดเป็นไปโดยไม่มีกฎเกณฑ์และอาจไม่ใช่สิ่งที่กำหนด ดังนั้น ฟังก์ชันการลดนี้จึงไม่ควรคำนึงถึง
การเชื่อมโยงใหม่มากเกินไป ดูรายละเอียดเพิ่มเติมได้ในการอภิปรายเกี่ยวกับความเชื่อมโยงในบริบทของ Reduce
ReplicaId
ดูเพิ่มเติมที่
XlaBuilder::ReplicaId
แสดงผลรหัสที่ไม่ซ้ำกัน (สเกลาร์ U32) ของตัวจำลอง
ReplicaId()
รหัสที่ไม่ซ้ำกันของตัวจำลองแต่ละรายการคือจำนวนเต็มที่ไม่มีเครื่องหมายในช่วง [0, N)
โดย N
คือจำนวนตัวจำลอง เนื่องจากตัวจำลองทั้งหมดเรียกใช้โปรแกรมเดียวกัน การเรียกใช้ ReplicaId()
ในโปรแกรมจะแสดงผลค่าที่ต่างกันสำหรับตัวจำลองแต่ละรายการ
ปรับรูปร่าง
ดู XlaBuilder::Reshape
และการดําเนินการ Collapse
เพิ่มเติม
เปลี่ยนรูปร่างของอาร์เรย์เป็นการกำหนดค่าใหม่
Reshape(operand, new_sizes)
Reshape(operand, dimensions, new_sizes)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ประเภท T |
dimensions |
int64 เวกเตอร์ |
ลำดับการยุบมิติข้อมูล |
new_sizes |
int64 เวกเตอร์ |
เวกเตอร์ของขนาดของขนาดใหม่ |
โดยหลักการแล้ว จะต้องปรับรูปร่างของอาร์เรย์ให้เป็นเวกเตอร์ 1 มิติของค่าข้อมูลก่อน แล้วจึงปรับแต่งเวกเตอร์นี้เป็นรูปร่างใหม่ อาร์กิวเมนต์อินพุตคืออาร์เรย์ที่กำหนดเองของประเภท T ซึ่งเป็นเวกเตอร์คงที่เวลาคอมไพล์ของดัชนีมิติข้อมูล และเวกเตอร์คงที่เวลาคอมไพล์ของขนาดมิติข้อมูลสำหรับผลลัพธ์
หากมีค่าในเวกเตอร์ dimension
ค่าจะต้องเป็นการเรียงสับเปลี่ยนของมิติข้อมูล T ทั้งหมด ค่าเริ่มต้นหากไม่ได้กำหนดคือ {0, ..., rank - 1}
ลำดับของมิติข้อมูลใน dimensions
เริ่มจากมิติข้อมูลที่เปลี่ยนแปลงช้าที่สุด (หลัก) ไปจนถึงมิติข้อมูลที่เปลี่ยนแปลงเร็วที่สุด (น้อยที่สุด) ใน Nest Loop ซึ่งจะยุบอาร์เรย์อินพุตเป็นมิติข้อมูลเดียว เวกเตอร์ new_sizes
จะกำหนดขนาดของอาร์เรย์เอาต์พุต ค่าที่ดัชนี 0 ใน new_sizes
คือขนาดของมิติข้อมูล 0 ค่าในดัชนี 1 คือขนาดของมิติข้อมูล 1 และต่อไปเรื่อยๆ ผลิตภัณฑ์ของมิติข้อมูล new_size
ต้องเท่ากับผลคูณของขนาดตัวถูกดำเนินการ เมื่อปรับแต่งอาร์เรย์ที่ยุบเป็นอาร์เรย์หลายมิติที่ new_sizes
กำหนด มิติข้อมูลใน new_sizes
จะเรียงลำดับจากต่างกันช้าที่สุด (ใหญ่ที่สุด) ไปจนถึงแปรผันเร็วที่สุด (น้อยที่สุด)
ตัวอย่างเช่น กำหนดให้ 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} } };
In-order collapse:
let v012_24 = Reshape(v, {0,1,2}, {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, {0,1,2}, {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} };
Out-of-order collapse:
let v021_24 = Reshape(v, {1,2,0}, {24});
then v012_24 == f32[24] {10, 20, 30, 40, 11, 21, 31, 41, 12, 22, 32, 42,
15, 25, 35, 45, 16, 26, 36, 46, 17, 27, 37, 47};
let v021_83 = Reshape(v, {1,2,0}, {8,3});
then v021_83 == f32[8x3] { {10, 20, 30}, {40, 11, 21},
{31, 41, 12}, {22, 32, 42},
{15, 25, 35}, {45, 16, 26},
{36, 46, 17}, {27, 37, 47} };
let v021_262 = Reshape(v, {1,2,0}, {2,6,2});
then v021_262 == f32[2x6x2] { { {10, 20}, {30, 40},
{11, 21}, {31, 41},
{12, 22}, {32, 42} },
{ {15, 25}, {35, 45},
{16, 26}, {36, 46},
{17, 27}, {37, 47} } };
ในกรณีพิเศษ การปรับรูปร่างสามารถเปลี่ยนอาร์เรย์องค์ประกอบเดียวเป็นสเกลาร์และในทางกลับกันด้วย ตัวอย่างเช่น
Reshape(f32[1x1] { {5} }, {0,1}, {}) == 5;
Reshape(5, {}, {1,1}) == f32[1x1] { {5} };
Rev (ย้อนกลับ)
ดูเพิ่มเติมที่
XlaBuilder::Rev
Rev(operand, dimensions)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์ประเภท T |
dimensions |
ArraySlice<int64> |
มิติข้อมูลที่จะกลับด้าน |
ย้อนกลับลำดับขององค์ประกอบในอาร์เรย์ operand
ตาม dimensions
ที่ระบุ ซึ่งเป็นการสร้างอาร์เรย์เอาต์พุตที่มีรูปร่างเดียวกัน แต่ละองค์ประกอบของอาร์เรย์ตัวถูกดำเนินการในดัชนีหลายมิติจะได้รับการจัดเก็บลงในอาร์เรย์เอาต์พุตในดัชนีที่มีการเปลี่ยนรูปแบบ ดัชนีหลายมิติจะเปลี่ยนรูปแบบโดยการกลับดัชนีในแต่ละมิติข้อมูลเพื่อกลับด้าน (กล่าวคือ หากมิติข้อมูลขนาด N เป็นหนึ่งในมิติข้อมูลกลับด้าน ดัชนี i ของนั้นจะแปลงเป็น N - 1 - i)
การใช้งานอย่างหนึ่งสำหรับการดำเนินการ Rev
คือการกลับลำดับน้ำหนักคอนโวลูชันตามขนาดหน้าต่างทั้ง 2 ด้านระหว่างการคำนวณการไล่ระดับสีในเครือข่ายประสาท
RngNormal
ดูเพิ่มเติมที่
XlaBuilder::RngNormal
สร้างเอาต์พุตของรูปร่างที่กำหนดด้วยตัวเลขสุ่มที่สร้างขึ้นตาม \(N(\mu, \sigma)\) การกระจายปกติ พารามิเตอร์ \(\mu\) และ \(\sigma\)และรูปร่างเอาต์พุตต้องมีประเภทองค์ประกอบที่เป็นจุดทศนิยม นอกจากนี้ พารามิเตอร์ยังต้องมีค่าแบบสเกลาร์ด้วย
RngNormal(mu, sigma, shape)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
mu |
XlaOp |
สเกลาร์ของประเภท T ที่ระบุค่าเฉลี่ยของจำนวนที่สร้างขึ้น |
sigma |
XlaOp |
สเกลาร์ของประเภท T ที่ระบุส่วนเบี่ยงเบนมาตรฐานของประเภทที่สร้างขึ้น |
shape |
Shape |
รูปร่างเอาต์พุตของประเภท T |
RngUniform
ดูเพิ่มเติมที่
XlaBuilder::RngUniform
สร้างเอาต์พุตของรูปร่างที่กำหนดด้วยตัวเลขสุ่มที่สร้างขึ้นหลังจากการกระจายที่สม่ำเสมอตลอดช่วงเวลา \([a,b)\)ประเภทองค์ประกอบพารามิเตอร์และองค์ประกอบเอาต์พุตต้องเป็นประเภทบูลีน ประเภทปริพันธ์หรือประเภทจุดทศนิยม และประเภทองค์ประกอบต้องสอดคล้องกัน ปัจจุบันแบ็กเอนด์ของ CPU และ GPU รองรับเฉพาะ F64, F32, F16, BF16, S64, U64, S32 และ U32 นอกจากนี้ พารามิเตอร์ต้องมีค่าแบบสเกลาร์ด้วย ถ้า \(b <= a\) ผลลัพธ์คือ การใช้งานกำหนดไว้
RngUniform(a, b, shape)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
a |
XlaOp |
สเกลาร์ของประเภท T ที่ระบุขีดจำกัดต่ำสุดของช่วงเวลา |
b |
XlaOp |
สเกลาร์ของประเภท T ที่ระบุขีดจำกัดบนของช่วง |
shape |
Shape |
รูปร่างเอาต์พุตของประเภท T |
RngBitGenerator
สร้างเอาต์พุตด้วยรูปร่างที่กำหนดซึ่งเต็มไปด้วยบิตแบบสุ่มที่สม่ำเสมอโดยใช้อัลกอริทึมที่ระบุ (หรือค่าเริ่มต้นของแบ็กเอนด์) และแสดงผลสถานะที่อัปเดต (โดยมีรูปทรงเดียวกับสถานะเริ่มต้น) และข้อมูลแบบสุ่มที่สร้างขึ้น
สถานะเริ่มต้นคือสถานะเริ่มต้นของการสร้างหมายเลขสุ่มปัจจุบัน พารามิเตอร์และรูปร่างที่กำหนดและค่าที่ถูกต้องจะขึ้นอยู่กับอัลกอริทึมที่ใช้
เอาต์พุตนี้รับประกันได้ว่าเป็นฟังก์ชันเชิงกำหนดของสถานะเริ่มต้น แต่ก็ไม่รับประกันว่าจะมีการกำหนดระหว่างแบ็กเอนด์และเวอร์ชันคอมไพเลอร์ที่ต่างกัน
RngBitGenerator(algorithm, key, shape)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
algorithm |
RandomAlgorithm |
อัลกอริทึม PRNG ที่จะใช้ |
initial_state |
XlaOp |
สถานะเริ่มต้นสำหรับอัลกอริทึม PRNG |
shape |
Shape |
รูปร่างเอาต์พุตสำหรับข้อมูลที่สร้างขึ้น |
ค่าที่ใช้ได้สำหรับ algorithm
:
rng_default
: อัลกอริทึมที่เจาะจงของแบ็กเอนด์ที่มีข้อกำหนดรูปร่างที่เจาะจงของแบ็กเอนด์rng_three_fry
: อัลกอริทึม PRNG แบบ ThreeFry แบบนับ รูปร่างinitial_state
คือu64[2]
ซึ่งมีค่าที่กำหนดเอง Salmon et al. SC 2011 เลขสุ่มคู่ขนาน: ง่ายเหมือนเลข 1, 2, 3rng_philox
: อัลกอริทึม Philox สร้างตัวเลขสุ่มแบบคู่ขนาน รูปร่างinitial_state
คือu64[3]
ซึ่งมีค่าที่กำหนดเอง Salmon et al. SC 2011 เลขสุ่มคู่ขนาน: ง่ายเหมือนเลข 1, 2, 3
แผนภูมิกระจาย
การดำเนินการกระจาย XLA จะสร้างผลลัพธ์ตามลำดับซึ่งเป็นค่าของอาร์เรย์อินพุต operands
โดยมีหลายส่วน (ที่ดัชนีระบุโดย scatter_indices
) อัปเดตด้วยลำดับของค่าใน updates
โดยใช้ update_computation
ดูเพิ่มเติมที่
XlaBuilder::Scatter
scatter(operands..., scatter_indices, updates..., update_computation,
index_vector_dim, update_window_dims, inserted_window_dims,
scatter_dims_to_operand_dims)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
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] โดยจะต้องเป็นแบบ 1 ต่อ 1 และทั้งหมด |
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)
จะเป็น Tuple ขององค์ประกอบN
ประเภทT
หาก index_vector_dim
เท่ากับ scatter_indices.rank
เราจะถือว่า scatter_indices
มีมิติข้อมูล 1
ต่อท้าย
เราให้คำจำกัดความ update_scatter_dims
ของประเภท ArraySlice<int64>
คือชุดของมิติข้อมูลในรูปร่าง updates
ที่ไม่อยู่ใน update_window_dims
โดยเรียงลำดับจากน้อยไปหามาก
อาร์กิวเมนต์ของการกระจายควรเป็นไปตามข้อจำกัดต่อไปนี้
อาร์เรย์
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
ที่ตรงกันซึ่งมีการคำนวณดังนี้
- ให้
G
= {U
[k
] สำหรับk
ในupdate_scatter_dims
} ใช้G
เพื่อค้นหาเวกเตอร์ดัชนีS
ในอาร์เรย์scatter_indices
ที่S
[i
] =scatter_indices
[รวม(G
,i
)] โดยที่ "รวม" (A, b) แทรก b ที่ ตำแหน่งindex_vector_dim
ลงใน A - สร้างดัชนี
S
in
ลงในoperand
โดยใช้S
โดยการกระจายS
โดยใช้แมปscatter_dims_to_operand_dims
อย่างเป็นทางการมากขึ้น ได้แก่S
in
[scatter_dims_to_operand_dims
[k
]] =S
[k
] หากk
<scatter_dims_to_operand_dims.size
S
in
[_
] =0
หากไม่เป็นเช่นนั้น
- สร้างดัชนี
W
in
ลงในอาร์เรย์operands
แต่ละอาร์เรย์โดยกระจายดัชนีที่update_window_dims
ในU
ตามinserted_window_dims
อย่างเป็นทางการมากขึ้น ได้แก่W
in
[window_dims_to_operand_dims
(k
)] =U
[k
] หากk
อยู่ในupdate_window_dims
โดยที่window_dims_to_operand_dims
เป็นฟังก์ชันแบบโมโนโทนที่มีโดเมน [0
,update_window_dims.size
) และช่วง [0
,operand.rank
) \inserted_window_dims
(เช่น หากupdate_window_dims.size
คือ4
,operand.rank
คือ6
และinserted_window_dims
คือ {0
,2
} ดังนั้นwindow_dims_to_operand_dims
จะเท่ากับ {0
→1
,1
→3
,2
→4
,3
→5
})W
in
[_
] =0
หากไม่เป็นเช่นนั้น
I
คือW
in
+S
in
โดยที่ + เป็นการบวกตามองค์ประกอบ
กล่าวโดยสรุป การกระจายข้อมูลสามารถกำหนดได้ดังนี้
- เริ่มต้น
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
เสมอ และพารามิเตอร์ที่ 2 จะเป็นค่าจากอาร์เรย์ updates
เสมอ ซึ่งสำคัญอย่างยิ่งในกรณีที่ update_computation
ไม่สามารถใช้แทนกันได้
หากตั้งค่า indices_are_sorted
เป็น "จริง" XLA จะถือว่าผู้ใช้จัดเรียง start_indices
(ตามลำดับจากน้อยไปมาก)start_index_map
หากไม่ได้ใช้ ความหมายคือ "การติดตั้งใช้งาน"
หากตั้งค่า unique_indices
เป็น "จริง" XLA จะถือว่าองค์ประกอบทั้งหมดที่กระจัดกระจายไม่ซ้ำกัน ดังนั้น XLA สามารถใช้การดำเนินการที่ไม่ใช่อะตอม หากตั้งค่า unique_indices
เป็น "จริง" และดัชนีที่กระจายอยู่เป็นค่าซ้ำกัน แสดงว่าอรรถศาสตร์มีการกำหนดไว้
อย่างไม่เป็นทางการ การแสดงผลแบบกระจายอาจมองได้ว่าเป็นการผกผันของ OP การรวมข้อมูล กล่าวคือ ออบเจ็กต์กระจายจะอัปเดตองค์ประกอบในอินพุตที่แยกออกโดย op ของการรวบรวมที่เกี่ยวข้อง
สำหรับคำอธิบายและตัวอย่างแบบไม่เป็นทางการโดยละเอียด โปรดดู
ส่วน "คำอธิบายอย่างไม่เป็นทางการ" ใน Gather
เลือก
ดูเพิ่มเติมที่
XlaBuilder::Select
สร้างอาร์เรย์เอาต์พุตจากองค์ประกอบของอาร์เรย์อินพุต 2 รายการ โดยอิงตามค่าของอาร์เรย์เพรดิเคต
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};
รองรับการเลือกระหว่าง Tuple Tuple ถือเป็นประเภทสเกลาร์สำหรับจุดประสงค์นี้ หาก on_true
และ on_false
เป็น 2 เท่า (ซึ่งต้องมีรูปร่างเหมือนกัน) pred
จะต้องเป็นสเกลาร์ประเภท PRED
SelectAndScatter
ดูเพิ่มเติมที่
XlaBuilder::SelectAndScatter
การดำเนินการนี้ถือเป็นการดำเนินการแบบผสมที่จะคำนวณ ReduceWindow
ในอาร์เรย์ operand
เพื่อเลือกองค์ประกอบจากแต่ละหน้าต่างก่อน จากนั้นกระจายอาร์เรย์ source
ไปยังดัชนีขององค์ประกอบที่เลือกเพื่อสร้างอาร์เรย์เอาต์พุตที่มีรูปร่างเดียวกับอาร์เรย์โอเปอแรนด์ ระบบใช้ฟังก์ชัน select
สำหรับไบนารีเพื่อเลือกองค์ประกอบจากแต่ละหน้าต่างโดยนำไปใช้กับแต่ละหน้าต่าง และเรียกด้วยพร็อพเพอร์ตี้ว่าเวกเตอร์ดัชนีของพารามิเตอร์แรกเป็นแบบพจนานุกรมน้อยกว่าเวกเตอร์ดัชนีของพารามิเตอร์ที่ 2 ฟังก์ชัน select
จะแสดงผล true
หากเลือกพารามิเตอร์แรกไว้ และแสดงผล false
หากเลือกพารามิเตอร์ที่ 2 และฟังก์ชันจะต้องคงการเปลี่ยนสถานะ (เช่น หาก select(a, b)
และ select(b, c)
เป็น true
แล้ว select(a, c)
จะเป็น true
ด้วย) เพื่อให้องค์ประกอบที่เลือกไม่ขึ้นอยู่กับลำดับขององค์ประกอบที่ข้ามผ่านสำหรับหน้าต่างที่ระบุ
ระบบจะใช้ฟังก์ชัน scatter
ที่ดัชนีที่เลือกแต่ละรายการในอาร์เรย์เอาต์พุต ต้องใช้พารามิเตอร์สเกลาร์ 2 ตัว ได้แก่
- ค่าปัจจุบันที่ดัชนีที่เลือกในอาร์เรย์เอาต์พุต
- ค่ากระจายจาก
source
ที่ใช้กับดัชนีที่เลือก
โดยจะรวมพารามิเตอร์ 2 ตัวเข้าด้วยกันและแสดงผลค่าสเกลาร์ที่ใช้อัปเดตค่าในดัชนีที่เลือกในอาร์เรย์เอาต์พุต ในขั้นต้น ดัชนีทั้งหมดของอาร์เรย์เอาต์พุตจะตั้งค่าเป็น 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 หากเลือกพารามิเตอร์ที่ 2 |
window_dimensions |
ArraySlice<int64> |
อาร์เรย์ของจำนวนเต็มสำหรับค่ามิติข้อมูลหน้าต่าง |
window_strides |
ArraySlice<int64> |
อาร์เรย์ของจำนวนเต็มสำหรับค่า Window Stride |
padding |
Padding |
ประเภทระยะห่างจากขอบสำหรับหน้าต่าง (แพดดิง::kSame หรือ Padding::kValid) |
source |
XlaOp |
อาร์เรย์ประเภท T ที่มีค่ากระจาย |
init_value |
XlaOp |
ค่าสเกลาร์ของประเภท T สำหรับค่าเริ่มต้นของอาร์เรย์เอาต์พุต |
scatter |
XlaComputation |
การคํานวณไบนารีประเภท T, T -> T เพื่อใช้องค์ประกอบต้นทางแบบกระจายแต่ละรายการกับองค์ประกอบปลายทาง |
ภาพด้านล่างแสดงตัวอย่างการใช้ SelectAndScatter
โดยที่ select
จะคํานวณค่าสูงสุดจากพารามิเตอร์ต่างๆ โปรดทราบว่าเมื่อหน้าต่างทับซ้อนกันดังที่แสดงในรูป (2) ด้านล่าง ระบบอาจเลือกดัชนีของอาร์เรย์ operand
หลายครั้งในแต่ละหน้าต่าง ในรูป องค์ประกอบของค่า 9 จะเลือกโดยหน้าต่างด้านบนทั้ง 2 หน้าต่าง (สีน้ำเงินและสีแดง) และฟังก์ชันการเพิ่มไบนารี scatter
จะสร้างองค์ประกอบเอาต์พุตที่มีค่า 8 (2 + 6)
ลำดับการประเมินของฟังก์ชัน scatter
เป็นแบบอิสระและอาจไม่ได้กำหนด ดังนั้น ฟังก์ชัน scatter
ไม่ควรมีความละเอียดอ่อนต่อการเชื่อมโยงใหม่มากเกินไป ดูรายละเอียดเพิ่มเติมได้ในการอภิปรายเกี่ยวกับความเชื่อมโยงในบริบทของ Reduce
ส่ง
ดูเพิ่มเติมที่
XlaBuilder::Send
Send(operand, channel_handle)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
ข้อมูลที่จะส่ง (อาร์เรย์ประเภท T) |
channel_handle |
ChannelHandle |
ตัวระบุที่ไม่ซ้ำกันสำหรับคู่การส่ง/รับแต่ละคู่ |
ส่งข้อมูลตัวถูกดำเนินการที่ระบุไปยังคำสั่ง Recv
ในการคำนวณอีกแบบหนึ่งที่ใช้แฮนเดิลของช่องเดียวกัน ไม่แสดงข้อมูลใดๆ
เช่นเดียวกับการดำเนินการ Recv
ไคลเอ็นต์ API ของการดำเนินการ Send
จะแสดงการสื่อสารแบบซิงโครนัส และแยกย่อยเป็นคำสั่ง HLO จำนวน 2 คำสั่ง (Send
และ SendDone
) เพื่อเปิดใช้การโอนข้อมูลแบบไม่พร้อมกัน ดู HloInstruction::CreateSend
และ HloInstruction::CreateSendDone
เพิ่มเติม
Send(HloInstruction operand, int64 channel_id)
เริ่มการโอนตัวถูกดำเนินการแบบไม่พร้อมกันไปยังทรัพยากรที่จัดสรรโดยคำสั่ง Recv
ที่มีรหัสแชแนลเดียวกัน แสดงผลบริบทซึ่งใช้โดยคำสั่ง SendDone
ต่อไปนี้เพื่อให้การโอนข้อมูลเสร็จสมบูรณ์ บริบทเป็นกลุ่มของ {operand (shape), ตัวระบุคำขอ (U32)} และใช้ได้ในคำสั่ง SendDone
เท่านั้น
SendDone(HloInstruction context)
หลังจากที่มีบริบทที่สร้างโดยคำสั่ง Send
โปรดรอให้การโอนข้อมูลเสร็จสมบูรณ์ คำสั่งจะไม่แสดงข้อมูลใดๆ
การกำหนดเวลาสำหรับวิธีการของช่อง
ลำดับการดำเนินการของวิธีการ 4 รายการสำหรับแต่ละแชแนล (Recv
, RecvDone
,
Send
, SendDone
) มีดังนี้
Recv
เกิดขึ้นก่อนSend
Send
เกิดขึ้นก่อนRecvDone
Recv
เกิดขึ้นก่อนRecvDone
Send
เกิดขึ้นก่อนSendDone
เมื่อคอมไพเลอร์แบ็กเอนด์สร้างกำหนดการเชิงเส้นสำหรับการคำนวณแต่ละครั้งที่สื่อสารผ่านคำสั่งของแชแนล ต้องไม่มีวงจรในการคำนวณ เช่น กำหนดการด้านล่างอาจนำไปสู่การติดตาย
Slice
ดูเพิ่มเติมที่
XlaBuilder::Slice
การแบ่งส่วนจะแยกอาร์เรย์ย่อยออกจากอาร์เรย์อินพุต อาร์เรย์ย่อยมีอันดับเดียวกับอินพุตและมีค่าภายในกรอบล้อมรอบภายในอาร์เรย์อินพุตที่ระบุมิติข้อมูลและดัชนีของกล่องขอบเขตเป็นอาร์กิวเมนต์สำหรับการดำเนินการส่วนแบ่ง
Slice(operand, start_indices, limit_indices, strides)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
อาร์เรย์มิติของประเภท T |
start_indices |
ArraySlice<int64> |
รายการจำนวนเต็ม N ที่มีดัชนีเริ่มต้นของสไลซ์สำหรับแต่ละมิติข้อมูล ค่าต้องมากกว่าหรือเท่ากับ 0 |
limit_indices |
ArraySlice<int64> |
รายการจำนวนเต็ม N ที่มีดัชนีสิ้นสุด (แยกเฉพาะ) สำหรับสไลซ์ของแต่ละมิติข้อมูล แต่ละค่าต้องมากกว่าหรือเท่ากับค่า start_indices ที่เกี่ยวข้องสําหรับมิติข้อมูล และน้อยกว่าหรือเท่ากับขนาดของมิติข้อมูล |
strides |
ArraySlice<int64> |
รายการจำนวนเต็ม N ที่ตัดสินอัตราก้าวของอินพุตของส่วนแบ่ง สไลซ์จะเลือกองค์ประกอบ strides[d] ทุกรายการในมิติข้อมูล d |
ตัวอย่าง 1 มิติ:
let a = {0.0, 1.0, 2.0, 3.0, 4.0}
Slice(a, {2}, {4}) produces:
{2.0, 3.0}
ตัวอย่าง 2 มิติ:
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}) produces:
{ { 7.0, 8.0},
{10.0, 11.0} }
จัดเรียง
ดูเพิ่มเติมที่
XlaBuilder::Sort
Sort(operands, comparator, dimension, is_stable)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operands |
ArraySlice<XlaOp> |
ตัวถูกดำเนินการที่จะจัดเรียง |
comparator |
XlaComputation |
การคำนวณของตัวเปรียบเทียบที่จะใช้ |
dimension |
int64 |
มิติข้อมูลที่ต้องการจัดเรียง |
is_stable |
bool |
ควรใช้การจัดเรียงที่เสถียรหรือไม่ |
หากระบุตัวถูกดำเนินการรายการเดียว:
ถ้าตัวถูกดำเนินการเป็น Tensor อันดับ -1 (อาร์เรย์) ผลลัพธ์จะเป็นอาร์เรย์ที่มีการจัดเรียง ถ้าต้องการจัดเรียงอาร์เรย์ตามลำดับจากน้อยไปมาก เครื่องมือเปรียบเทียบควรเปรียบเทียบน้อยกว่า อย่างเป็นทางการ หลังจากจัดเรียงอาร์เรย์แล้ว จะมีการเก็บรักษาตำแหน่งดัชนีทั้งหมด
i, j
ที่มีi < j
ที่comparator(value[i], value[j]) = comparator(value[j], value[i]) = false
หรือcomparator(value[i], value[j]) = true
หากตัวถูกดำเนินการมีอันดับสูงกว่า ตัวถูกดำเนินการจะจัดเรียงตามมิติข้อมูลที่ให้ไว้ เช่น สำหรับ Tensor อันดับ 2 (เมทริกซ์) ค่ามิติข้อมูล
0
จะจัดเรียงทุกคอลัมน์แยกกัน และค่ามิติข้อมูล1
จะจัดเรียงแต่ละแถวอย่างอิสระ หากไม่ได้ระบุหมายเลขมิติข้อมูล ระบบจะเลือกมิติข้อมูลสุดท้ายโดยค่าเริ่มต้น สำหรับมิติข้อมูลที่มีการจัดเรียง ระบบจะใช้ลำดับการจัดเรียงแบบเดียวกับกรณีอันดับ 1
หากมีตัวถูกดำเนินการ n > 1
อยู่
ตัวถูกดำเนินการ
n
ทั้งหมดต้องเป็น Tensor ที่มีขนาดเท่ากัน ประเภทองค์ประกอบ ของ tensors อาจแตกต่างกันตัวถูกดำเนินการทั้งหมดจะจัดเรียงไว้ด้วยกัน ไม่ใช่แยกกัน โดยหลักแล้ว ตัวถูกดำเนินการ จะได้รับการปฏิบัติเสมือนเป็น Tuple เมื่อตรวจสอบว่าต้องสลับองค์ประกอบของตัวถูกดำเนินการแต่ละรายการที่ตำแหน่งดัชนี
i
และj
หรือไม่ ระบบจะเรียกตัวเปรียบเทียบด้วยพารามิเตอร์สเกลาร์2 * n
โดยที่พารามิเตอร์2 * k
จะสอดคล้องกับค่าที่ตำแหน่งi
จากตัวถูกดำเนินการk-th
และพารามิเตอร์2 * k + 1
สอดคล้องกับค่าที่ตำแหน่งj
จากตัวถูกดำเนินการk-th
โดยทั่วไป เครื่องมือเปรียบเทียบจะเปรียบเทียบพารามิเตอร์2 * k
และ2 * k + 1
กับพารามิเตอร์อื่นกันเอง และอาจใช้คู่พารามิเตอร์อื่นเป็นตัวตัดตอนเสมอผลลัพธ์คือ Tuple ที่ประกอบด้วยตัวถูกดำเนินการตามลำดับที่จัดเรียง (พร้อมด้วยมิติข้อมูลที่ให้ไว้ด้านบน) ตัวถูกดำเนินการ
i-th
ของ Tuple สอดคล้องกับตัวถูกดำเนินการi-th
ของจัดเรียง
เช่น หากมีตัวถูกดำเนินการ 3 รายการ operand0 = [3, 1]
, operand1 = [42, 50]
, operand2 = [-3.0, 1.1]
และเครื่องเปรียบเทียบจะเปรียบเทียบเฉพาะค่าของ operand0
ที่มีค่าน้อยกว่า เอาต์พุตของการจัดเรียงจะเป็น tuple ([1, 3], [50, 42], [1.1, -3.0])
หากตั้งค่า is_stable
เป็น "จริง" ระบบจะรับประกันการจัดเรียงจะเสถียร กล่าวคือ หากมีองค์ประกอบที่ตัวเปรียบเทียบถือว่าเท่ากัน ลำดับสัมพัทธ์ของค่าที่เท่ากันจะยังคงอยู่ องค์ประกอบ 2 รายการ e1
และ e2
จะถือว่าเท่ากันก็ต่อเมื่อเป็น comparator(e1, e2) = comparator(e2, e1) = false
ตามค่าเริ่มต้น is_stable
จะตั้งค่าเป็น false
สลับ
โปรดดูการดำเนินการ tf.reshape
ด้วย
Transpose(operand)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
operand |
XlaOp |
ตัวถูกดำเนินการที่จะสลับแกน |
permutation |
ArraySlice<int64> |
วิธีลดมิติข้อมูล |
เรียงสับเปลี่ยนมิติข้อมูลโอเปอแรนด์ด้วยการเรียงสับเปลี่ยนที่กำหนด ดังนั้น ∀ i . 0 ≤ i < rank ⇒ input_dimensions[permutation[i]] = output_dimensions[i]
ซึ่งจะเหมือนกับ Reshape(โอเปอเรเตอร์, การเรียงสับเปลี่ยน, Permute(permutation, operand.shape.dimensions))
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 |
อันดับ > 2 ของประเภทเชิงซ้อนหรือประเภทจุดลอยตัวที่มีรูปร่าง [..., M, M] |
b |
XlaOp |
อาร์เรย์อันดับ > 2 ของประเภทเดียวกันที่มีรูปร่าง [..., M, K] หาก left_side เป็น "จริง" [..., 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
ต้องมีมิติข้อมูลกลุ่มเท่าๆ กัน
ลายนูน
ดูเพิ่มเติมที่
XlaBuilder::Tuple
ทูเล็ตที่มีจำนวนตัวแปรของแฮนเดิลข้อมูล ซึ่งแต่ละอันมีรูปร่างของตัวเอง
ค่านี้เทียบเคียงกับ 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
ในขณะที่
ดูเพิ่มเติมที่
XlaBuilder::While
While(condition, body, init)
อาร์กิวเมนต์ | ประเภท | อรรถศาสตร์ |
---|---|---|
condition |
XlaComputation |
XlaComputation ของประเภท T -> PRED ซึ่งกำหนดเงื่อนไขการสิ้นสุดของลูป |
body |
XlaComputation |
XlaComputation ของประเภท T -> T ซึ่งกำหนดเนื้อหาของลูป |
init |
T |
ค่าเริ่มต้นสำหรับพารามิเตอร์ของ condition และ body |
เรียกใช้ body
ตามลำดับจนกว่า condition
จะล้มเหลว ซึ่งคล้ายกับกฎทั่วไปขณะวนซ้ำในภาษาอื่นๆ มากมาย ยกเว้นความแตกต่างและข้อจำกัดที่ระบุไว้ด้านล่าง
- โหนด
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};
}