mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-08 17:17:15 +00:00
Improve rpb cuda kernel (#14195)
### Description Average latency (ms) of float16 relative position bias cuda kernel on V100: Kernel\Seq_Len | 16 | 32 | 64 | 128 | 256 | 384 | 512 | 768 | 1024 | 2048 | 4096 -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- Before| 0.0494 | 0.0654 | 0.1519 | 0.4322 | 1.1865 | 2.4091 | 4.3676 | 14.912 | 36.517 | 142.09 | 561.80 After | 0.0483 | 0.0651 | 0.1294 | 0.3858 | 1.1128 | 2.2988 | 3.8391 | 14.290 | 34.542 | 136.13 | 529.54 ### Motivation and Context <!-- - Why is this change required? What problem does it solve? - If it fixes an open issue, please link to the issue here. --> Review of this comment https://github.com/microsoft/onnxruntime/pull/14149/#discussion_r1063152021 Co-authored-by: Ubuntu <wy@v100-2.0cdb2e52twzevn1i4fi45bylyg.jx.internal.cloudapp.net>
This commit is contained in:
parent
d152452d4b
commit
342a5bf2b7
3 changed files with 49 additions and 17 deletions
|
|
@ -57,6 +57,7 @@ Status RelPosAttnBias<T>::ComputeInternal(OpKernelContext* context) const {
|
|||
|
||||
typedef typename ToCudaType<T>::MappedType CudaT;
|
||||
|
||||
auto& device_prop = GetDeviceProp();
|
||||
return LaunchRelPosAttnBiasKernel<CudaT>(Stream(context),
|
||||
reinterpret_cast<CudaT*>(output->template MutableData<T>()),
|
||||
reinterpret_cast<const CudaT*>(bias_table->template Data<T>()),
|
||||
|
|
@ -64,7 +65,8 @@ Status RelPosAttnBias<T>::ComputeInternal(OpKernelContext* context) const {
|
|||
static_cast<int>(query_len),
|
||||
static_cast<int>(num_buckets),
|
||||
max_distance_,
|
||||
is_bidirectional_);
|
||||
is_bidirectional_,
|
||||
device_prop.maxThreadsPerBlock);
|
||||
}
|
||||
|
||||
} // namespace cuda
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ __global__ void buildRelativeAttentionBias(T* relative_attention_bias,
|
|||
const bool is_bidirectional,
|
||||
const int max_distance) {
|
||||
const int head_id = blockIdx.x;
|
||||
for (int seq_id = threadIdx.x; seq_id < seq_len * seq_len; seq_id += blockDim.x) {
|
||||
for (int seq_id = threadIdx.x; seq_id < seq_len * seq_len; seq_id += blockDim.x * gridDim.y) {
|
||||
int row_id = seq_id / seq_len;
|
||||
int col_id = seq_id % seq_len;
|
||||
|
||||
|
|
@ -86,20 +86,47 @@ Status LaunchRelPosAttnBiasKernel(
|
|||
const int seq_len,
|
||||
const int num_bucket,
|
||||
const int max_distance,
|
||||
const bool is_bidirectional)
|
||||
const bool is_bidirectional,
|
||||
const int max_threads_per_block)
|
||||
{
|
||||
dim3 grid(num_heads);
|
||||
dim3 block(256);
|
||||
const int squared_sq_len = seq_len * seq_len;
|
||||
if (squared_sq_len <= max_threads_per_block) {
|
||||
dim3 grid(num_heads);
|
||||
dim3 block(squared_sq_len);
|
||||
buildRelativeAttentionBias<<<grid, block, 0, stream>>>(output,
|
||||
bias_table,
|
||||
num_heads,
|
||||
seq_len,
|
||||
num_bucket,
|
||||
is_bidirectional,
|
||||
max_distance);
|
||||
return CUDA_CALL(cudaGetLastError());
|
||||
} else if (seq_len >= 128 && seq_len <= 384) {
|
||||
dim3 grid(num_heads, seq_len);
|
||||
dim3 block(seq_len);
|
||||
buildRelativeAttentionBias<<<grid, block, 0, stream>>>(output,
|
||||
bias_table,
|
||||
num_heads,
|
||||
seq_len,
|
||||
num_bucket,
|
||||
is_bidirectional,
|
||||
max_distance);
|
||||
return CUDA_CALL(cudaGetLastError());
|
||||
} else {
|
||||
int blockSize = max_threads_per_block;
|
||||
const int grid_y_Size = (squared_sq_len + blockSize - 1) / blockSize;
|
||||
dim3 grid(num_heads, grid_y_Size);
|
||||
dim3 block(blockSize);
|
||||
buildRelativeAttentionBias<<<grid, block, 0, stream>>>(output,
|
||||
bias_table,
|
||||
num_heads,
|
||||
seq_len,
|
||||
num_bucket,
|
||||
is_bidirectional,
|
||||
max_distance);
|
||||
|
||||
buildRelativeAttentionBias<<<grid, block, 0, stream>>>(output,
|
||||
bias_table,
|
||||
num_heads,
|
||||
seq_len,
|
||||
num_bucket,
|
||||
is_bidirectional,
|
||||
max_distance);
|
||||
|
||||
return CUDA_CALL(cudaGetLastError());
|
||||
return CUDA_CALL(cudaGetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
template Status LaunchRelPosAttnBiasKernel<float>(cudaStream_t stream,
|
||||
|
|
@ -109,7 +136,8 @@ template Status LaunchRelPosAttnBiasKernel<float>(cudaStream_t stream,
|
|||
const int seq_len,
|
||||
const int num_bucket,
|
||||
const int max_distance,
|
||||
const bool is_bidirectional);
|
||||
const bool is_bidirectional,
|
||||
const int max_threads_per_block);
|
||||
|
||||
template Status LaunchRelPosAttnBiasKernel<half>(cudaStream_t stream,
|
||||
half* output,
|
||||
|
|
@ -118,7 +146,8 @@ template Status LaunchRelPosAttnBiasKernel<half>(cudaStream_t stream,
|
|||
const int seq_len,
|
||||
const int num_bucket,
|
||||
const int max_distance,
|
||||
const bool is_bidirectional);
|
||||
const bool is_bidirectional,
|
||||
const int max_threads_per_block);
|
||||
|
||||
} // namespace cuda
|
||||
} // namespace contrib
|
||||
|
|
|
|||
|
|
@ -18,7 +18,8 @@ Status LaunchRelPosAttnBiasKernel(
|
|||
const int seq_len,
|
||||
const int num_bucket,
|
||||
const int max_distance,
|
||||
const bool is_bidirectional
|
||||
const bool is_bidirectional,
|
||||
const int max_threads_per_block
|
||||
);
|
||||
|
||||
} // namespace cuda
|
||||
|
|
|
|||
Loading…
Reference in a new issue