Этот справочник платформ RKNN2 V2.5.0 предназначен для разработчиков ArmSoM при выборе и адаптации моделей. Он не подтверждает поддержку на всех платах ArmSoM: проверьте SoC платы, фактические версии Toolkit2, Runtime, драйвера NPU и BSP. В оригинале не задана единая версия ядра Linux. Аппаратная проверка на ArmSoM не выполнялась.
Источник: предоставленные китайская и английская редакции RKNN2 Supported Operators and Constraints Reference V2.5.0, 374 и 384 страницы. Китайский текст следует китайской редакции; английский, русский и немецкий — английской. Ограничения платформ не объединяются. В английском PDF рисунки и таблицы I/O содержат китайские подписи; их происхождение сохранено, добавлены редактируемые локализованные таблицы. Написание ConvTranpose и исходные уравнения LSTM/GRU сохранены; эти формулы не являются исправлениями реализации SDK.
Страницы источника: CN 263–278; EN 271–286.
Серия справочников операторов
RKNN2 V2.5.0 · RK3566/RK3568:Основы и свёртки
RKNN2 V2.5.0 · RK3566/RK3568:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RK3566/RK3568:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RK3566/RK3568:Активации, нормализация и расширения
RKNN2 V2.5.0 · RK3588:Основы и свёртки
RKNN2 V2.5.0 · RK3588:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RK3588:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RK3588:Активации, нормализация и расширения
RKNN2 V2.5.0 · RK3562:Основы и свёртки
RKNN2 V2.5.0 · RK3562:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RK3562:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RK3562:Активации, нормализация и расширения
RKNN2 V2.5.0 · RV1103/RV1106:Основы и свёртки
RKNN2 V2.5.0 · RV1103/RV1106:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RV1103/RV1106:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RV1103/RV1106:Активации, нормализация и расширения
RKNN2 V2.5.0 · RK3576/RV1126B:Основы и свёртки
RKNN2 V2.5.0 · RK3576/RV1126B:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RK3576/RV1126B:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RK3576/RV1126B:Активации, нормализация и расширения
RKNN2 V2.5.0 · RK2118:Основы и свёртки
RKNN2 V2.5.0 · RK2118:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RK2118:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RK2118:Активации, нормализация и расширения
RKNN2 V2.5.0 · RV1103B/RV1106B:Основы и свёртки
RKNN2 V2.5.0 · RV1103B/RV1106B:Рекуррентные сети, арифметика и пулинг
RKNN2 V2.5.0 · RV1103B/RV1106B:Формы, срезы и транспонирование
RKNN2 V2.5.0 · RV1103B/RV1106B:Активации, нормализация и расширения
RKNN2 V2.5.0 · Поддержка и ограничения операторов CPU
RKNN2 V2.5.0 · Поддержка и ограничения операторов GPU
RKNN2 V2.5.0 · Ввод/вывод модели, выравнивание и ограничения свёрток
Sigmoid
Функция y=1/(1+exp(-x)) применяется поэлементно к входному тензору для получения выходного тензора.
Входы
- input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Tanh
Вычисляет гиперболический тангенс элементов входного тензора.
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Softplus
Поэлементно применяет Softplus, y=ln(exp(x)+1).
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
HardSigmoid
Функция y=max(0,min(1,alpha*x+beta)) применяется поэлементно к входному тензору для получения выходного тензора, где alpha=1/6, beta=0.5.
Входы
- input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
HardSwish
Функция y = x * max(0, min(1, alpha * x + beta)) = x * HardSigmoid(x) применяется поэлементно к входному тензору для получения выходного тензора, где alpha=1/6, beta=0.5.
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Elu
Функция f(x)=alpha*(exp(x)-1.) for x<0; f(x)=x for x>=0 применяется поэлементно к входному тензору для получения выходного тензора, где alpha=1.
Входы
- input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exSwish
Поэлементно применяет линейный блок Sigmoid. Swish также называется SiLU: y=x*sigmoid(x).
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exMish
Функция mish(x)=xtanh(softplus(x))=xtanh(ln(1+e^{x})) применяется поэлементно к входному тензору для получения выходного тензора.
Входы
- input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exGelu
Функция y = x*Φ(x) применяется поэлементно к входному тензору для получения выходного тензора. При выборе tanh для Φ(x): y = 0.5*x*(1+Tanh(sqrt(2/π)*(x+0.044715*x^3))).
Входы
- input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Sin
Вычисляет Sin поэлементно для заданного входного тензора.
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Cos
Вычисляет Cos поэлементно для заданного входного тензора.
Входы
- X:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Y:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
Where
Выбирает значения x_tensor или y_tensor по mask_tensor: при True берётся соответствующее значение x_tensor, иначе y_tensor.
Входы
- mask_tensor:T1
- shape:[batch,channel,height,width]
- Поддержка расширения размерностей
- Поддерживается расширение по любой размерности.
- Ограничения расширения размерностей
- Ограничения расширения совпадают с оператором Expand.
- x_tensor:T2
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
- Поддержка расширения размерностей
- Поддерживается расширение по любой размерности.
- Ограничения расширения размерностей
- Ограничения расширения совпадают с оператором Expand.
- y_tensor:T2
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
- Поддержка расширения размерностей
- Поддерживается расширение по любой размерности.
- Ограничения расширения размерностей
- Ограничения расширения совпадают с оператором Expand.
Выходы
- output:T2
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:bool(Tensor)
- T2:int8(Tensor),float16(Tensor)
exConvStreaming
Для снижения задержки речевых моделей вход исходной свёртки делится на временные фрагменты. Каждый фрагмент обрабатывается свёрткой, а результаты кэшируются для следующих кадров, обеспечивая потоковую обработку аудио.
Входы
- input_tensor:T1
- shape:[batch,channel,height,width]
- width: сейчас поддерживается width=1.
- Поддержка квантования
- per-layer
- shape:[batch,channel,height,width]
- weight:T1
- shape:[output_channel,input_channel,kernel_h,kernel_w]
- kernel_h∈[1,31]
- kernel_w∈[1,31]
- Поддержка квантования
- per-layer
- per-channel
- shape:[output_channel,input_channel,kernel_h,kernel_w]
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Атрибуты
- strides:int(strides_h,strides_w)
- stride_h∈[1,7]
- stride_w∈[1,7]
- pads:int(pads_top,pads_left,pads_bottom,pads_right)
- pads_top∈[0,15]
- pads_left∈[0,15]
- pads_bottom∈[0,15]
- pads_right∈[0,15]
- group:int
- dilations:int(dilations_h,dilations_w)
- dilations_h∈[1,32]
- dilations_w∈[1,32]
Ограничения типов данных
- T1:float16(Tensor)
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exConvStreamingPRelu/LeakyRelu
Объединённое вычисление exConvStreaming и PRelu/LeakyRelu, Output = PRelu(exConvStreaming(Input)) или Output= LeakyRelu(exConvStreaming(Input)). Описание и ограничения спецификации совпадают с exConvStreaming.
exGlu
Функция управляемого линейного блока (Gated Linear Unit), где a — первая половина входной матрицы, b — вторая: GLU(a,b)=a⊗σ(b).
Входы
- Input:T1
- shape:[batch,channel,height,width]
- Поддержка квантования: per-layer
Выходы
- Output:T1
- shape:[batch,channel/2,height,width]
- Поддержка квантования: per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Атрибуты
- axis:int(по умолчанию=1)
- Размерность разделения входа.
- Ограничение: поддерживается только 1.
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exMatMul
Матричное умножение
Y = A·B + C if c_type = "add"
Y = A·B * C if c_type = "mul"
Входы
- A:T1
- shape:[b,k,1,n]
- k ∈(0,8192]
- Поддержка квантования
- per-layer
- shape:[b,k,1,n]
- B:T1
- shape:[b,k,1,m]
- Поддержка квантования
- per-layer
- C(optional):T1,T2
- shape:[b,n,1,m]
- Поддержка квантования
- per-layer
- Поддержка расширения размерностей
- Поддерживается расширение по любой размерности.
- Ограничения расширения совпадают с оператором Expand.
Выходы
- Y:T1
- shape:[b,n,1,m]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
- T2:float(Tensor)
Атрибуты
- c_type:strings(по умолчанию “add”)
- Выбор add или mul задаёт сложение или умножение с C.
Прочие возможности
- Совместная работа нескольких ядер: не поддерживается.
exNorm
Выполняет различные операции нормализации входных данных. Поддерживаются три типа: LayerNormalization, RMSNormalization и MeanVarianceNormalization:
LayerNorm(x) = ((x - μ) / sqrt(σ^2 + ε)) * W + B
RMSNorm(x) = (x / sqrt(RMS^2 + ε)) * W + B
MeanVarianceNorm(x) = ((x - μ) / sqrt(Variance + ε)) * W + B
Здесь x — входной вектор. µ и σ2 — его среднее и дисперсия:
μ = (1/H) * Σ[i=1..H](x_i)
σ^2 = (1/H) * Σ[i=1..H]((x_i - μ)^2)
RMS — среднеквадратичное значение входного вектора:
RMS = sqrt((1/H) * Σ[i=1..H](x_i^2))
Variance — эквивалентная дисперсия входного вектора:
Variance = (1/H) * Σ[i=1..H](x_i^2) - μ^2
ϵ — малое число для предотвращения деления на ноль. W и B — необязательные параметры.
Входы
- X:T1
- shape:[batch,channel,height,width]
- W(optional):T1
- shape:[batch,channel,height,width]
- B(optional):T1
- shape:[batch,channel,height,width]
Выходы
- Y:T1
- shape:[batch,channel,height,width]
Ограничения типов данных
- T1:float16(Tensor)
Атрибуты
- epsilon: float (по умолчанию 1e-05)
- Значение epsilon для предотвращения деления на 0.
- mode:string
- Доступны три режима Normalization: layer, rms и mean_var.
- axes:int64[](по умолчанию [1])
- Оси нормализации: сейчас поддерживаются только [1] и [1,2,3].
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
exSDPAttention
Вычисляет масштабированное скалярное внимание (SDPA) между query, key и value.
Входы
- query:T1
- shape:[batch,channel,height,width]
- channel∈(0,8192]
- Поддержка квантования
- per-layer
- shape:[batch,channel,height,width]
- key:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
- value:T1
- shape:[batch,channel,height,width]
- channel∈(0,8192]
- Поддержка квантования
- per-layer
- shape:[batch,channel,height,width]
- mask(optional):T1,T2
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
- Поддержка расширения размерностей
- По умолчанию поддерживается расширение по любой размерности.
- При включённом FA поддерживаются только [b,c,1,1],[1,c,1,1] и [1,c,h,w].
- scale(optional):T3
Выходы
- output:T1
- shape:[batch,channel,height,width]
- Поддержка квантования
- per-layer
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
- T2:float(Tensor)
- T3:float(Scalar)
Прочие возможности
- Совместная работа нескольких ядер: поддерживается на RK3576 / не поддерживается на RV1126B.
- FlashAttentionV2(FA): поддерживается.
- Реализация основана на https://arxiv.org/abs/2307.08691. Внутренние циклы в кэше ускоряют вычисления и снижают расход пропускной способности, но увеличивают размер модели; включайте с учётом сценария и модели.
- Версия драйвера RKNPU>=0.9.7
- Версия библиотеки RKNPU Runtime (librknnrt.so)>=2.1.0
- Поддерживаемый тип данных:float16.
exWindow
exWindow основан на window_partition и window_reverse из swin_transformer. В исходной статье входные признаки делятся на непересекающиеся окна window_size×window_size. Входные и выходные признаки должны иметь 4-мерный shape с разбиением по высоте и ширине. Ниже реализация PyTorch:
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
Входы
- X:T1
- shape:[batch,channel,height,width]
Выходы
- Y:T1
- shape:[batch,channel,height,width]
Ограничения типов данных
- T1:int8(Tensor),float16(Tensor)
Атрибуты
- mode:string
- Поддерживаемые режимы:partition,reverse,partition_num_first.
- partition: см. реализацию window_partition.
- reverse: см. реализацию window_reverse.
- partition_num_first отличается от partition тем, что H,W делятся согласно num_windows, тогда как partition делит H,W согласно window_sizes.
- Поддерживаемые режимы:partition,reverse,partition_num_first.
- window_sizes:listofints
- 2-мерный вектор размера окна, задающий высоту и ширину каждого окна. На этом размере основаны вычисление внимания и извлечение признаков внутри окна.
- num_windows:listofints
- 2-мерный вектор числа окон, задающий количество окон по высоте и ширине входных признаков.
Прочие возможности
- Совместная работа нескольких ядер: ещё не поддерживается.
