コンテンツにスキップ

ONNX モデルの演算(試験中)

この章は試験中です。 ここに無い演算を含むモデルは、コンパイルの時点でエラーになります。

演算条件
GemmA と B は 2 次元です。transA・transB・alpha・beta を扱います。要素の型は float32・float64 と、opset 9 からの int32・uint32・int64・uint64 です。整数では alpha と beta が 1 のものだけを受け取ります
MatMul1 次元の相手は受け取れません。前にある軸はブロードキャストします。要素の型は Gemm と同じです
Add2 本の入力をブロードキャストします。2 本の要素の型は同じです。要素の型は float32・float64 と、整数(32 ビットと 64 ビットは opset 6 から、8 ビットと 16 ビットは opset 14 から)です。bool は受け取れません
Sub2 本の入力をブロードキャストします。要素の型は Add と同じです
Mul2 本の入力をブロードキャストします。要素の型は Add と同じです
Relu要素の型は float32・float64 と、opset 14 からの符号つきの整数(int8・int16・int32・int64)です。符号なしの整数と bool は受け取れません。NaN と -0 は、書き出し元の実行環境と同じくそのまま返します
Identity条件はありません。bool を含め、Udon で持てる要素の型を全部受け取ります
Flattenaxis は入力の次元の範囲内です。float32・float64 以外の要素の型は opset 9 からです
Reshape形は定数で渡します(実行時に渡す形は受け取れません)。float32・float64 以外の要素の型は opset 5 からです

GPU で計算する属性の演算(8 ビットのモデル)

Section titled “GPU で計算する属性の演算(8 ビットのモデル)”
演算条件
Convkernel_shape は縦と横が同じです。strides と dilations を扱います。group は 1 か、入力と出力の channel 数に等しい形(depthwise)だけです。auto_pad は SAME_UPPER・SAME_LOWER・VALID を扱います(SAME は dilations と組み合わせられません)
DepthToSpace並べ方は DCR と CRD です。倍率は 2 の冪で、channel が倍率の 2 乗で割り切れる必要があります
Concatchannel の軸で継ぐ形だけです。継げるのは 4 本までで、各入力の channel は 4 の倍数です
Add2 本とも前の演算の出力で、形が同じです。定数を足す形は受け取れません
QuantizeLinear計算ではなく、量子化の尺度として読みます。尺度とゼロ点は定数です
DequantizeLinear計算ではなく、量子化の尺度として読みます。量子化の代わりに Cast(float16)と Cast(float32)の組を置くと、その間は半精度の実数で運びます
Padreflect で、縁を埋めない Conv の直前に置いた形だけです(Conv に畳みます)
InstanceNormalizationscale と B は定数です
Resize補間は linear だけです。coordinate_transformation_mode は half_pixel・pytorch_half_pixel・align_corners・asymmetric を扱います。変えられるのは縦と横だけです
PRelu傾きは定数で、1 個か、channel の軸にかかる形([C, 1, 1] など)です
MaxPoolkernel_shape は縦と横が同じで、dilations は受け取れません。auto_pad は SAME_UPPER・SAME_LOWER・VALID を扱います。最大値の位置(Indices)は出せません
Elu8 ビットの入力だけです
Relu半精度の実数の入力も受け取ります。入力の NaN は 0 になることがあります(実数のモデルの「NaN」)
LeakyRelu半精度の実数の入力も受け取ります
Tanh8 ビットの入力だけです
Sigmoid8 ビットの入力だけです
Clip上限と下限は定数です。半精度の実数の入力も受け取ります。下限が上限より大きいときは、書き出し元の実行環境と同じく全部の値が上限になります。入力の NaN は上下限になることがあります
HardSigmoidalpha・beta を扱います
HardSwish条件はありません
Softplus条件はありません
Softsign条件はありません
Selualpha・gamma を扱います
Celualpha を扱います
Sin条件はありません
Exp条件はありません。実数のモデルでは、出力が 65504 を超えうるものを TUKI0135 の警告で名指します
Neg条件はありません
Abs条件はありません
Cos条件はありません
Erf条件はありません
Atan条件はありません
Floor条件はありません。実数のモデルでは 16 ビットへ丸めた入力を読むので、0 か負の整数のすぐ下の値は、元のモデルより 1 大きい答えになります
Asinh条件はありません
Roundちょうど半分の値は偶数へ丸めます。実数のモデルでは 16 ビットへ丸めた入力を読むので、整数の部分が偶数の値で半分をわずかに越えた値(2.5001 など)は、元のモデルと 1 違う答え(3 でなく 2)になります(1024 から 2048 では、端数が半分以上の値のほとんどです)
Sign条件はありません。実数のモデルでは、16 ビットで表せない小さな値(およそ 6e-8 未満)は 0 になります
Shrinkbias・lambd を扱います。実数のモデルでは 16 ビットへ丸めた入力を読むので、lambd のすぐ外の値は、大きさが lambd から bias を引いた値に近い答えではなく 0 になります
ThresholdedRelualpha を扱います。実数のモデルでは 16 ビットへ丸めた入力を読むので、alpha のすぐ上の値は、alpha の近くの値ではなく 0 になります
Log0 以下の入力は元のモデルと同じく NaN か無限大になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Sqrt負の入力は元のモデルと同じく NaN になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Reciprocal0 の入力は元のモデルと同じく無限大になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Ceil条件はありません。実数のモデルでは 16 ビットへ丸めた入力を読むので、0 か正の整数のすぐ上の値は、元のモデルより 1 小さい答えになります(1024 から 2048 では、整数でない正の値の全部です)
Tan条件はありません
Asin-1 から 1 の外の入力は、元のモデルと同じく NaN になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Acos-1 から 1 の外の入力は、元のモデルと同じく NaN になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Sinh条件はありません
Cosh条件はありません
Acosh1 より小さい入力は、元のモデルと同じく NaN になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)
Atanh-1 から 1 の外の入力は、元のモデルと同じく NaN か無限大になります(8 ビットのモデルでは、定義域の外の入力の値が元のモデルと一致する保証はありません)

GPU で計算する属性の演算(実数のモデルだけ)

Section titled “GPU で計算する属性の演算(実数のモデルだけ)”
演算条件
Splitどの軸でも分けられます。分けた長さは定数です(split の属性も読みます)
Sub片方は定数でもよく、ブロードキャストします(定数のほうが大きく、出力が前の演算の出力より大きくなる形も受け取ります)。2 本とも前の演算の出力なら、軸ごとに同じ長さかどちらかが 1 です(片方が出力と同じ形なら、もう片方の channel の役の軸は全部か 1 つも。[1, 6, 1] と [1, 1, 8] のように両方が広がる形も受け取ります)
Mul片方は定数でもよく、ブロードキャストします(定数のほうが大きく、出力が前の演算の出力より大きくなる形も受け取ります)。2 本とも前の演算の出力なら、軸ごとに同じ長さかどちらかが 1 です(片方が出力と同じ形なら、もう片方の channel の役の軸は全部か 1 つも。[1, 6, 1] と [1, 1, 8] のように両方が広がる形も受け取ります)
Divどちらかが定数なら、割る側でも割られる側でもかまいません(出力が前の演算の出力より大きくなる形も受け取ります)。2 本とも前の演算の出力なら Mul と同じ条件です
Pow指数か底のどちらかは、値が 1 つの定数です(定数の軸が多く、出力の軸が増える形も受け取ります)。出力が 65504 を超えうるものは TUKI0135 の警告で名指します。負の指数で、16 ビットで 0 になりうる値(16 ビットで表せない小さな値を足した値など)を読むものはエラーです(受け取れるモデル)
LayerNormalization最後の軸だけを正規化します(画像を channels-last に並べ替えた形では画素ごとに channel を正規化します)。scale と bias は定数です。平均と標準偏差の逆数は出力できません
Softmax最後の軸(後ろの軸が全部長さ 1 ならその軸)か、画像の channel の軸のように channel の役の軸の全部か、行の役の軸([1, C, T] の T など)で正規化します。長さは 4 の倍数でなくてもかまいません
MatMul片方が定数なら重みとして 2 次元で持ちます(定数が左でもかまいません)。2 本とも前の演算の出力でもかまいません(長さは 4 の倍数でなくてもかまいません。大きさの分からない値どうしの積は TUKI0135 の警告で名指します)。8 ビットと 4 ビットの重みは、長さが 4 の倍数でなければ 16 ビットで持ちます
GemmA と B は 2 次元です。transB・alpha・beta を扱いますが、transA は受け取れません。B は前の演算の出力でもかまいません。C は 1 つの値か、出力の列ごとの値です。[1, K] の入力をそのまま受け取ります
Gather語彙の表を軸 0 で参照する形(番号はモデルの整数の入力・形は [1, T]・0 から 65535・表の 1 行の値の数は 4 の倍数)と、前の演算の出力を定数の添字で参照する形です。添字は負でもかまいません。範囲の外の添字と、行ごとに違う行を参照する形は受け取れません
RMSNormalization最後の軸だけを正規化します(LayerNormalization と同じ条件です)。scale は定数です
Swish条件はありません
GroupNormalizationchannel は組の数で割り切れます。scale と B は組の数だけの定数です。Reshape → InstanceNormalization → Reshape の組もこの演算として受け取ります(戻す先が [1, C, H·W] の形も含みます)。1 次元の畳み込みの並び([1, C, L])も扱います
Slice軸はいくつでもよく、刻みは 0 以外(負の刻みも)です。範囲と刻みは定数です
LogSoftmax最後の軸(後ろの軸が全部長さ 1 ならその軸)か、画像の channel の軸のように channel の役の軸の全部か、行の役の軸([1, C, T] の T など)で正規化します。長さは 4 の倍数でなくてもかまいません
Hardmax最後の軸(後ろの軸が全部長さ 1 ならその軸)か、画像の channel の軸のように channel の役の軸の全部か、行の役の軸([1, C, T] の T など)で正規化します。長さは 4 の倍数でなくてもかまいません。同じ値が並ぶときは最初の位置を選びます。比べる値どうしが 16 ビットで等しくなる僅差でも最初の位置を選ぶので、元のモデルと違う位置を選ぶことがあります
LpNormalizationchannel の役の軸([1, T, D] の D・画像 [1, C, H, W] の軸 1)だけを正規化します。p は 1 か 2 です。画像では画素ごとに channel を正規化します(channel を最後に置いた並びも同じです)
Mod片方は値が 1 つの定数で、fmod は 1 です。16 ビットへ丸めた入力を読むので、割る数の倍数のすぐ先の値は、元のモデルとおよそ割る数だけ違う答えになります
Where条件は定数(bool)で、残りの 2 つの入力は片方が定数、もう片方が前の演算の出力です。定数か条件の形が大きく、出力が前の演算の出力より大きくなる形も受け取ります
Mish条件はありません
Geluapproximate は none と tanh を扱います
Max前の演算の出力 2 本以上で、定数を混ぜてもかまいません(9 本以上の形と、定数を混ぜた 3 本以上の形は、入力の順に前から比べる層の列に分けます)。前の演算の出力どうしは形が同じです(2 本だけなら、[1, 6, 1] と [1, 1, 8] のように両方が出力の形へ広がる形も受け取ります)。前の演算の出力 1 本と定数 1 本なら、出力が前の演算の出力より大きくなる形も受け取ります。入力の NaN は、NaN の代わりにもう一方の値になることがあります
Min前の演算の出力 2 本以上で、定数を混ぜてもかまいません(9 本以上の形と、定数を混ぜた 3 本以上の形は、入力の順に前から比べる層の列に分けます)。前の演算の出力どうしは形が同じです(2 本だけなら、[1, 6, 1] と [1, 1, 8] のように両方が出力の形へ広がる形も受け取ります)。前の演算の出力 1 本と定数 1 本なら、出力が前の演算の出力より大きくなる形も受け取ります。入力の NaN は、NaN の代わりにもう一方の値になることがあります
Sum前の演算の出力 2〜8 本(形が同じ)か、前の演算の出力 1 本と定数 1 本です
Mean前の演算の出力 2〜8 本で、形が同じです。定数とは組み合わせられません
ReduceSum縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceMean縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceMax縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceMin縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceL1縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceL2縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceSumSquare縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います。出力が 65504 を超えうるものは TUKI0135 の警告で名指します
ReduceLogSumExp縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
ReduceProd縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います。出力が 65504 を超えうるものは TUKI0135 の警告で名指します
GlobalAveragePool入力は 3 次元以上です
GlobalMaxPool入力は 3 次元以上です
ReduceLogSum縮める軸は定数で、channel の役の軸は全部か 1 つも含めないかのどちらかです。keepdims を扱います
AveragePool1 次元か 2 次元のウィンドウで、縁の幅はウィンドウより小さい値です。count_include_pad・auto_pad・ceil_mode・dilations を扱います(入力の値を 1 つも読まないウィンドウは 0 を出します)
SpaceToDepthblocksize は 2 の冪でなくてもかまいません。mode は DCR だけです
ConvTranspose1 次元か 2 次元です。group・dilations・auto_pad も扱います。output_shape は、歩幅とウィンドウから決まる大きさを超えないものを扱います。重みは定数です。重みは 8 ビットか 4 ビットでもかまいません(16 ビットへ戻して読み、TUKI0123 の警告で名指します)
BatchNormalization推論の形だけで、係数は定数です。直前の Conv の重みへ畳みます
LpPoolp は 1 か 2 です。1 次元か 2 次元のウィンドウで、縁の幅はウィンドウより小さい値です。auto_pad・ceil_mode を扱い、dilations は受け取れません
MeanVarianceNormalization画像([1, C, H, W])の縦と横で正規化します。channel の役の軸が最後の軸だけの並び([1, T, D] の D など)では、最後の軸だけで正規化する形も受け取ります。長さ 1 の軸は axes に含まれていてもかまいません(既定の [0, 2, 3] は縦と横の形になります)
ArgMax位置を選ぶ軸の長さは 2048 までで、出力はモデルの出力としてだけ使えます(位置は 16 ビットの値に整数として入るので、後ろの演算には渡せません)。その軸が channel の役の軸なら、channel の役の軸はその 1 つだけです。keepdims・select_last_index を扱います。比べる値どうしが 16 ビットで等しくなる僅差では、元のモデルと違う位置を返すことがあります
ArgMin位置を選ぶ軸の長さは 2048 までで、出力はモデルの出力としてだけ使えます(位置は 16 ビットの値に整数として入るので、後ろの演算には渡せません)。その軸が channel の役の軸なら、channel の役の軸はその 1 つだけです。keepdims・select_last_index を扱います。比べる値どうしが 16 ビットで等しくなる僅差では、元のモデルと違う位置を返すことがあります
LSTM入力は batch が 1 で、時刻の軸が先頭です(layout が 0)。活性は既定のもので、clip・P(peephole)と、input_forget が 1 のものは受け取れません。初期状態(initial_h・initial_c)は無いか定数で、sequence_lens は全部が時刻の数に等しい定数のときだけ受け取ります。双方向のものは hidden_size が 4 の倍数です。最後の状態(Y_h・Y_c)も使えます
GRU入力は batch が 1 で、時刻の軸が先頭です(layout が 0)。活性は既定のもの、linear_before_reset は 1(PyTorch の書き出しの形)で、clip は受け取れません。初期状態(initial_h)は無いか定数で、sequence_lens は全部が時刻の数に等しい定数のときだけ受け取ります。双方向のものは hidden_size が 4 の倍数です。最後の状態(Y_h)も使えます
RNN入力は batch が 1 で、時刻の軸が先頭です(layout が 0)。活性は Tanh(既定)か、全部の方向が Relu のもので、clip は受け取れません。初期状態(initial_h)は無いか定数で、sequence_lens は全部が時刻の数に等しい定数のときだけ受け取ります。双方向のものは hidden_size が 4 の倍数です。最後の状態(Y_h)も使えます

実数のモデルでは 8 ビットのモデルの表の演算も使え、次の演算は条件が変わります。

演算実数のモデルでの条件
Conv1 次元と 2 次元を扱い、ウィンドウは縦と横が違ってもかまいません。group はいくつでもかまいません(群ごとの重みを 0 で埋めた 1 枚の重みにします)。入力の channel は 4 の倍数でなくてもかまいません。直前の Pad(reflect・edge・0 で埋める constant)はウィンドウの縁として読みます。重みは定数です
Resizenearest も扱います(縮小・整数でない倍率・nearest_mode の 4 種)。cubic は exclude_outside が 0 のものを扱います。antialias が 1 のもの(linear と cubic)も扱います。opset 10 の形(入力が X と scales)も読みます。coordinate_transformation_mode は half_pixel_symmetric も扱います。1 次元の信号([1, C, L])の linear と nearest も扱います。keep_aspect_ratio_policy は not_larger・not_smaller も、sizes が定数で roi の無いものを扱います(出力の長さは四捨五入で決まり、切り捨てと長さが違うものは 4 次元の縦と横だけを変える形です)
InstanceNormalization軸 1 が channel の役の軸のものだけです([1, T, D] の入力はエラーになります)
PRelu傾きは 1 個か、channel の役の軸([1, T, D] なら D・画像なら C)にかかる形です
DepthToSpace倍率は 2 の冪でなくてもかまいません。出力の channel は 4 の倍数でなくてもかまいません(超解像の出力の RGB など)
Elu・Tanh・Sigmoid実数の入力を受け取ります
Concatchannel の役の軸で継ぎます([1, T, D] なら D、画像なら C)。行の役の軸([1, T, D] の T・画像の縦)と列の役の軸(画像の横)でも継げます。9 本以上は 8 本以下の継ぎに分けて読みます。各入力の channel は 4 の倍数でなくてもかまいません。継ぐ軸より外側の軸が 1 でなくてもかまいません。入力どうしで値の並びの役が違うものはエラーになります。前の演算の出力と float32 の定数を混ぜて継ぐ形も受け取ります(CLS トークンなど・前の演算の出力が 2 本以上でもかまいません)
MaxPool1 次元と、縦と横が違うウィンドウも扱います。dilations も扱います(入力の値を 1 つも読まないウィンドウができるものはエラーになります)
MatMul画像を channels-last に並べ替えた形と重みの積は、画素ごとの積(1×1 の Conv)として読みます
Add片方は定数でもかまいません(出力が前の演算の出力より大きくなる形も受け取ります)。2 本とも前の演算の出力なら Sub と同じ条件です
Padreflect・edge・constant(値は定数)と、opset 19 からの wrap を、どの軸にも使えます。負の幅(切り取り)も扱います。Conv の直前で畳めない形は値を写して埋めます
DequantizeLinear重みだけを 8 ビットか 4 ビットにしたときの重みとしてだけ読みます
Reshape・Transpose値の並びを変えずに見かけの形だけを変えるもの、画像の行と列を 1 つの軸にまとめる(または分ける)もの、channel の役の軸の間で順を入れ替える Transpose を受け取ります。画像や系列のまま平らにして積(Gemm・MatMul)へ渡す形も受け取ります
演算受け取る形
Squeeze・Unsqueeze・Flatten・Identity値の並びを変えないものを受け取ります(Reshape と同じ条件です)
Expand・Tile形(shape・repeats)が定数のものを受け取ります
Constantテンソルと数値の値を定数として読みます。文字列の値は受け取れません
Dropout推論の形(training_mode が無いか定数の偽)で、マスクの出力を使わないものを受け取ります
Upsampleopset 7〜9 の形を、同じ値になる Resize として読みます
Shape・Size・ConstantOfShape・Range・Cast・EyeLike・HannWindow・HammingWindow・BlackmanWindow・GatherElements・ScatterND・ScatterElements・NonZero・OneHot・CastLike・CumSum・CumProd・Mod・Sign・Clip・Compress・Xor・IsNaN・IsInf・MelWeightMatrix定数だけで計算できるものと、形の注釈で値が決まる Shape から始まる計算は、読むときに計算して定数にします(簡約していないモデルに残る形の計算)
com.microsoft の MatMulNBits4 ビットの重みを DequantizeLinear で戻して掛ける MatMul として読みます(条件は実数のモデルにあります)
Scatteropset 10 までの形を、同じ値になる ScatterElements として読みます
Triluk が定数のものを、定数の条件で選ぶ Where として読みます
GlobalLpPoolp が 1 か 2 のものを、空間の軸を縮める ReduceL1・ReduceL2 として読みます
CenterCropPad目標の形が定数のものを、幅に負の値(切り取り)を含む Pad として読みます
GatherElements・GatherND・ReverseSequence・Compress添字(sequence_lens・condition)が定数で、値の移り先が channel・行・列ごとに決まるものを、値を写す段として読みます。Compress は axis のあるものだけです
ScatterND・ScatterElements添字と書く値が定数で、添字が重ならないものを、定数の条件で選ぶ Where として読みます
CumSum最後の軸(channel の役の軸)で足すものを、0 と 1 の定数との積として読みます
Cast・CastLike入力も出力も float のものは何もしない演算として読みます
ReduceSum などの縮約noop_with_empty_axes が 1 で axes が空のものは、演算に応じて何もしない演算・Abs・2 乗・Log として読みます
Resize の axesaxes を指定したものは、全部の軸の scales・sizes に広げて読みます
DFT実数と複素数の入力の順変換と逆変換(onesided の逆変換を含む)を、定数の重みとの積として読みます。axis と dft_length は定数です
Col2Im1 次元と 2 次元の重ね足し(PyTorch の fold など)を、image_shape と block_shape が定数のものに限って ConvTranspose として読みます。モデルの入力を直接受け取るものはエラーになります
STFT実数の信号([1, L, 1])で、frame_step・ウィンドウ・frame_length が定数のものを、ウィンドウの長さの 1 次元の Conv として読みます