Diese Plattformreferenz für RKNN2 V2.5.0 unterstützt ArmSoM-Entwickler bei der Modellauswahl und -anpassung. Sie bestätigt keine Unterstützung auf allen ArmSoM-Platinen: SoC, tatsächliche Toolkit2-, Runtime-, NPU-Treiber- und BSP-Versionen müssen geprüft werden. Die Quelle nennt keine einheitliche Linux-Kernel-Version. Es wurden keine ArmSoM-Hardwaretests durchgeführt.
Quelle: die bereitgestellte chinesische und englische RKNN2 Supported Operators and Constraints Reference V2.5.0 mit 374 bzw. 384 Seiten. Chinesisch folgt der chinesischen Ausgabe; Englisch, Russisch und Deutsch folgen der englischen. Plattformgrenzen bleiben getrennt. Das englische PDF enthält chinesische I/O-Abbildungen und Ausgabetabellen; zusätzlich werden editierbare lokalisierte Tabellen bereitgestellt. Schreibweisen wie ConvTranpose und ursprüngliche LSTM/GRU-Gleichungen bleiben erhalten; die Formeln stellen keine Korrekturen der SDK-Implementierung dar.
Quellseiten: CN 163–175; EN 168–180.
Operatorreferenz-Serie
RKNN2 V2.5.0 · RK3566/RK3568:Grundlagen und Faltungen
RKNN2 V2.5.0 · RK3566/RK3568:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RK3566/RK3568:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RK3566/RK3568:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RK3588:Grundlagen und Faltungen
RKNN2 V2.5.0 · RK3588:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RK3588:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RK3588:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RK3562:Grundlagen und Faltungen
RKNN2 V2.5.0 · RK3562:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RK3562:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RK3562:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RV1103/RV1106:Grundlagen und Faltungen
RKNN2 V2.5.0 · RV1103/RV1106:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RV1103/RV1106:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RV1103/RV1106:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RK3576/RV1126B:Grundlagen und Faltungen
RKNN2 V2.5.0 · RK3576/RV1126B:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RK3576/RV1126B:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RK3576/RV1126B:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RK2118:Grundlagen und Faltungen
RKNN2 V2.5.0 · RK2118:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RK2118:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RK2118:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · RV1103B/RV1106B:Grundlagen und Faltungen
RKNN2 V2.5.0 · RV1103B/RV1106B:Rekurrente Netze, Arithmetik und Pooling
RKNN2 V2.5.0 · RV1103B/RV1106B:Formen, Slicing und Transposition
RKNN2 V2.5.0 · RV1103B/RV1106B:Aktivierungen, Normalisierung und Erweiterungen
RKNN2 V2.5.0 · Unterstützung und Grenzen der CPU-Operatoren
Sigmoid
Die Funktion y=1/(1+exp(-x)) wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen.
Eingaben
- input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Tanh
Berechnet den hyperbolischen Tangens jedes Eingabetensorelements.
Eingaben
- X:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Softplus
Wendet Softplus elementweise an, y=ln(exp(x)+1).
Eingaben
- X:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
HardSigmoid
Die Funktion y=max(0,min(1,alpha*x+beta)) wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen, wobei alpha=1/6, beta=0.5.
Eingaben
- input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
HardSwish
Die Funktion y = x * max(0, min(1, alpha * x + beta)) = x * HardSigmoid(x) wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen, wobei alpha=1/6, beta=0.5.
Eingaben
- X:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Elu
Die Funktion f(x)=alpha*(exp(x)-1.) for x<0; f(x)=x for x>=0 wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen, wobei alpha=1.
Eingaben
- input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
exSwish
Wendet die Sigmoid Linear Unit elementweise an. Swish heißt auch SiLU: y=x*sigmoid(x).
Eingaben
- X:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
exMish
Die Funktion mish(x)=xtanh(softplus(x))=xtanh(ln(1+e^{x})) wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen.
Eingaben
- input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
exGelu
Die Funktion y = x*Φ(x) wird elementweise auf den Eingabetensor angewendet, um den Ausgabetensor zu erzeugen. Wird für Φ(x) tanh gewählt, gilt: y = 0.5*x*(1+Tanh(sqrt(2/π)*(x+0.044715*x^3))).
Eingaben
- input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Where
Wählt Werte aus x_tensor oder y_tensor anhand von mask_tensor: Bei True wird der entsprechende x_tensor-Wert gewählt, sonst der y_tensor-Wert.
Eingaben
- mask_tensor:T1
- shape:[batch,channel,height,width]
- Broadcasting-Unterstützung
- Broadcasting entlang beliebiger Dimensionen wird unterstützt.
- Broadcasting-Einschränkungen
- Broadcasting-Einschränkungen wie beim Operator Expand.
- x_tensor:*T2
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
- Broadcasting-Unterstützung
- Broadcasting entlang beliebiger Dimensionen wird unterstützt.
- Broadcasting-Einschränkungen
- Broadcasting-Einschränkungen wie beim Operator Expand.
- y_tensor:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
- Broadcasting-Unterstützung
- Broadcasting entlang beliebiger Dimensionen wird unterstützt.
- Broadcasting-Einschränkungen
- Broadcasting-Einschränkungen wie beim Operator Expand.
Ausgaben
- output:T2
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:bool(Tensor)
- T2:int8(Tensor),float16(Tensor)
exGlu
Gated-Linear-Unit-Funktion: a ist die erste Hälfte der Eingabematrix, b die zweite Hälfte: GLU(a,b)=a⊗σ(b).
Eingaben
- Input:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung: per-layer
Ausgaben
- Output:T1
- shape:[batch,channel/2,height,width]
- Quantisierungsunterstützung: per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Attribute
- axis:int(Standardwert=1)
- Dimension, entlang der die Eingabe geteilt wird.
- Einschränkung: nur 1 unterstützt.
exMatMul
Matrixmultiplikation
Y = A·B + C if c_type = "add"
Y = A·B * C if c_type = "mul"
Eingaben
- A:T1
- shape:[b,k,1,n]
- k ∈(0,8192]
- Quantisierungsunterstützung
- per-layer
- shape:[b,k,1,n]
- B:T1
- shape:[b,k,1,m]
- Quantisierungsunterstützung
- per-layer
- C(optional):T1,T2
- shape:[b,n,1,m]
- Quantisierungsunterstützung
- per-layer
- Broadcasting-Unterstützung
- Broadcasting entlang beliebiger Dimensionen wird unterstützt.
- Broadcasting-Einschränkungen wie beim Operator Expand.
Ausgaben
- Y:T1
- shape:[b,n,1,m]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
- T2:float(Tensor)
Attribute
- c_type:strings(Standardwert “add”)
- add oder mul legt fest, ob C addiert oder multipliziert wird.
exNorm
Führt verschiedene Normalisierungsoperationen auf den Eingabedaten aus. Unterstützt werden drei Typen: LayerNormalization, RMSNormalization und MeanVarianceNormalization:
LayerNorm(x) = ((x - μ) / sqrt(σ^2 + ε)) * W + B
RMSNorm(x) = (x / sqrt(RMS^2 + ε)) * W + B
MeanVarianceNorm(x) = ((x - μ) / sqrt(Variance + ε)) * W + B
Dabei ist x der Eingabevektor. µ und σ2 sind Mittelwert und Varianz des Eingabevektors:
μ = (1/H) * Σ[i=1..H](x_i)
σ^2 = (1/H) * Σ[i=1..H]((x_i - μ)^2)
RMS ist der quadratische Mittelwert des Eingabevektors:
RMS = sqrt((1/H) * Σ[i=1..H](x_i^2))
Variance ist die äquivalente Varianz des Eingabevektors:
Variance = (1/H) * Σ[i=1..H](x_i^2) - μ^2
ϵ ist ein kleiner Wert zur Vermeidung einer Division durch null. W und B sind optionale Parameter.
Eingaben
- X:T1
- shape:[batch,channel,height,width]
- W(optional):T1
- shape:[batch,channel,height,width]
- B(optional):T1
- shape:[batch,channel,height,width]
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
Datentypbeschränkungen
- T1:float16(Tensor)
Attribute
- epsilon: float (Standardwert 1e-05)
- epsilon-Wert zur Vermeidung einer Division durch 0.
- mode:string
- Drei Normalization-Modi sind wählbar: layer, rms und mean_var.
- axes:int64[](Standardwert [1])
- Normalisierungsachsen: derzeit nur [1] und [1,2,3] unterstützt.
Weitere Unterstützung
- Zusammenarbeit mehrerer Kerne: noch nicht unterstützt.
exSDPAttention
Berechnet skalierte Skalarprodukt-Aufmerksamkeit (SDPA) zwischen query, key und value.
Eingaben
- query:T1
- shape:[batch,channel,height,width]
- channel∈(0,8192]
- Quantisierungsunterstützung
- per-layer
- shape:[batch,channel,height,width]
- key:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
- value:T1
- shape:[batch,channel,height,width]
- channel∈(0,8192]
- Quantisierungsunterstützung
- per-layer
- shape:[batch,channel,height,width]
- mask(optional):T1,T2
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
- Broadcasting-Unterstützung
- Standardmäßig wird Broadcasting entlang beliebiger Dimensionen unterstützt.
- Bei aktiviertem FA werden nur [b,c,1,1],[1,c,1,1] und [1,c,h,w] unterstützt.
- scale(optional):T3
Ausgaben
- output:T1
- shape:[batch,channel,height,width]
- Quantisierungsunterstützung
- per-layer
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
- T2:float(Tensor)
- T3:float(Scalar)
Weitere Unterstützung
- FlashAttentionV2(FA): unterstützt.
- Basiert auf https://arxiv.org/abs/2307.08691. Innere Schleifen im Cache beschleunigen die Ausführung und reduzieren die Bandbreitennutzung, vergrößern aber das Modell. Je nach Szenario und Modell über die Aktivierung entscheiden.
- RKNPU-Treiberversion>=0.8.8
- Version der RKNPU-Runtime-Bibliothek (librknnrt.so)>=2.0.0
- Unterstützter Datentyp:float16.
exWindow
exWindow stammt von window_partition und window_reverse aus swin_transformer. In der Originalarbeit werden Eingabemerkmale in nicht überlappende Fenster der Größe window_size×window_size aufgeteilt. Ein- und Ausgabemerkmale müssen eine 4-dimensionale shape haben und in Höhe und Breite aufgeteilt werden. Die PyTorch-Implementierung folgt:
def window_partition(x, window_size):
"""
Args:
x: (B, C, H, W)
window_size (int): window size
Returns:
windows: (B, C, num_windows * num_windows, window_size * window_size)
"""
B, C, H, W = x.shape
x = x.view(B, C, H // window_size, window_size, W // window_size, window_size)
windows = x.permute(0, 1, 2, 4, 3, 5).contiguous().view(B, C, -1, window_size * window_size)
return windows
def window_reverse(windows, window_size, H, W):
"""
Args:
windows: (B, C, num_windows * num_windows, window_size * window_size)
window_size (int): Window size
H (int): Height of image
W (int): Width of image
Returns:
x: (B, C, H, W)
"""
B, C, _, _ = windows.shape
x = windows.view(B, C, H // window_size, W // window_size, window_size, window_size)
x = x.permute(0, 1, 2, 4, 3, 5).contiguous().view(B, C, H, W)
return x
Eingaben
- X:T1
- shape:[batch,channel,height,width]
Ausgaben
- Y:T1
- shape:[batch,channel,height,width]
Datentypbeschränkungen
- T1:int8(Tensor),float16(Tensor)
Attribute
- mode:string
- Unterstützte Modi:partition,reverse,partition_num_first.
- partition: siehe Implementierung von window_partition.
- reverse: siehe Implementierung von window_reverse.
- partition_num_first unterscheidet sich von partition dadurch, dass H,W nach num_windows aufgeteilt werden; partition teilt H,W dagegen nach window_sizes auf.
- Unterstützte Modi:partition,reverse,partition_num_first.
- window_sizes:listofints
- 2-dimensionaler Vektor der Fenstergröße, der Höhe und Breite jedes Fensters festlegt. Auf dieser Größe beruhen Aufmerksamkeitsberechnung und Merkmalsextraktion innerhalb des Fensters.
- num_windows:listofints
- 2-dimensionaler Vektor der Fensteranzahl; legt fest, in wie viele Fenster Höhe und Breite der Eingabemerkmale geteilt werden.
Weitere Unterstützung
- Zusammenarbeit mehrerer Kerne: noch nicht unterstützt.
