97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

科技設(shè)計(jì)網(wǎng)站有哪些去哪想找人幫我做網(wǎng)站

鶴壁市浩天電氣有限公司 2026/01/24 14:03:05
科技設(shè)計(jì)網(wǎng)站有哪些,去哪想找人幫我做網(wǎng)站,wordpress主頁鏈接失效,東莞網(wǎng)頁設(shè)計(jì)與制作教程在大模型推理、推薦系統(tǒng)排序、目標(biāo)檢測(cè)后處理等場(chǎng)景中#xff0c;TopK 是一個(gè)高頻操作#xff1a;python values, indices torch.topk(logits, k50) 但標(biāo)準(zhǔn)框架實(shí)現(xiàn)存在三大瓶頸#xff1a;### #x1f539; 瓶頸一#xff1a;固定 Shape 限制#xff0c;難以應(yīng)對(duì)動(dòng)態(tài)輸…在大模型推理、推薦系統(tǒng)排序、目標(biāo)檢測(cè)后處理等場(chǎng)景中TopK 是一個(gè)高頻操作pythonvalues, indices torch.topk(logits, k50)但標(biāo)準(zhǔn)框架實(shí)現(xiàn)存在三大瓶頸### 瓶頸一固定 Shape 限制難以應(yīng)對(duì)動(dòng)態(tài)輸入PyTorch/TensorFlow 中的 topk 多數(shù)依賴靜態(tài)圖編譯或內(nèi)建 kernel 預(yù)設(shè) shape。當(dāng) batch size 或序列長(zhǎng)度變化時(shí)如動(dòng)態(tài)批處理 Dynamic Batching必須重新編譯計(jì)算圖導(dǎo)致 **推理延遲突增、資源浪費(fèi)**。而昇騰平臺(tái)支持 **動(dòng)態(tài)Shape** 推理模式Dynamic Shape OM 模型 reshape 能力若底層算子不支持則整條鏈路無法發(fā)揮優(yōu)勢(shì)。 ? 自定義算子是打通“動(dòng)態(tài)化”最后一公里的關(guān)鍵### 瓶頸二通用實(shí)現(xiàn)未針對(duì) AI Core 架構(gòu)優(yōu)化主流框架的 TopK 實(shí)現(xiàn)多基于 CPU 或 CUDA直接移植到 Ascend 上常通過 AICPU 模擬執(zhí)行 —— 這意味著- 無法利用 AI Core 的并行計(jì)算能力- 數(shù)據(jù)頻繁往返全局內(nèi)存GML1/L2 緩存利用率不足- 單核串行掃描復(fù)雜度 O(N·logK) 無法拆分結(jié)果就是**明明有 32 個(gè) AI Core卻只用了一個(gè)**### 瓶頸三缺乏細(xì)粒度控制性能天花板低例如在百萬級(jí)詞匯表中取 Top-10N1e6, K10傳統(tǒng)做法是遍歷全部元素建堆。但在達(dá)芬奇架構(gòu)下我們完全可以- 利用向量化加載Vector Load- 分塊并行提取局部 TopK- 使用雙緩沖減少訪存停頓- 多核協(xié)同歸并結(jié)果這些“微操”只有通過 **Ascend C** 才能精準(zhǔn)掌控。---## ? 目標(biāo)構(gòu)建一個(gè)真正工業(yè)級(jí)的 TopK 算子我們要開發(fā)的 TopK 算子需滿足以下要求| 特性 | 是否支持 ||------|----------|| 動(dòng)態(tài)輸入 ShapeB×N | ? 支持 || 動(dòng)態(tài) K 值運(yùn)行時(shí)指定 | ? 支持 || largestTrue/False | ? 支持 || sortedTrue/False | ? 支持 || 在 AI Core 上原生執(zhí)行 | ? 支持 || 多核并行加速 | ? 支持 || L1 緩存優(yōu)化 | ? 支持 || 向量化訪存 | ? 支持 | 提示本文使用 **CANN 7.0 Ascend C 編程模型**基于 TBE 工具鏈完成從代碼到 OM 模型的端到端構(gòu)建。---## 一、Ascend C 編程模型簡(jiǎn)介Ascend C 是華為推出的一種面向 AI Core 的高性能編程語言擴(kuò)展本質(zhì)是 **類 C 的 DSLDomain Specific Language**允許開發(fā)者直接操控- Tensor 存儲(chǔ)布局- L1/L2 緩存分配- DMA 數(shù)據(jù)搬運(yùn)- 多核并行調(diào)度- 向量指令集SIMD其核心抽象包括| 抽象 | 說明 ||------|------|| __aicore__ | 標(biāo)記函數(shù)運(yùn)行于 AI Core || Tensor | 表示駐留在 GM / L1 的張量 || tik (可選) | 更高層的 Python 接口用于調(diào)試和集成 || blockIdx, threadIdx | 類似 CUDA 的線程索引機(jī)制 | ?? 注意Ascend C 不等于 C不能調(diào)用 STL 容器或 malloc/free所有內(nèi)存需顯式管理。---## ? 二、整體架構(gòu)設(shè)計(jì)兩級(jí) TopK 歸約策略由于 TopK 操作不具備天然可分性不像 ReduceSum 可以 map-reduce我們采用經(jīng)典的 **Two-Stage Reduction** 架構(gòu)[Input: B x N]↓┌────────────┐│ 分塊掃描 │ → 每個(gè) tile 提取局部 TopK最小堆維護(hù)最大K個(gè)└────────────┘↓┌────────────┐│ 全局歸并 │ → 合并所有候選選出最終 TopK└────────────┘↓[Output: B x K]### ? 優(yōu)勢(shì)分析- 并行度高每行或多行可由不同 AI Core 處理- 內(nèi)存友好tile 小則可緩存至 L1提升帶寬利用率- 易于擴(kuò)展支持任意大的 N百萬級(jí)詞表也無壓力---## 三、核心代碼實(shí)現(xiàn)Ascend C### 3.1 頭文件與基礎(chǔ)結(jié)構(gòu)cpp#include kernel_operator.husing namespace ge;// 參數(shù)配置#define TILE_SIZE 256 // 每個(gè) tile 處理的數(shù)據(jù)量#define MAX_SUPPORTED_K 1024 // 最大支持 K 值#define VECTOR_LEN 16 // 向量寄存器長(zhǎng)度FP32// 值-索引對(duì)struct Pair {float value;int index;__aicore__ inline bool operator(const Pair other) const { return value other.value; }__aicore__ inline bool operator(const Pair other) const { return value other.value; }};### 3.2 最小堆實(shí)現(xiàn)用于維護(hù) Top-K 候選集cppclass MinHeap {public:Pair data[MAX_SUPPORTED_K];int size;__aicore__ MinHeap() : size(0) {}__aicore__ void push(const Pair p, bool is_largest) {// 若當(dāng)前值優(yōu)于堆頂則插入if (size 0 ||(is_largest p.value data[0].value) ||(!is_largest p.value data[0].value)) {if (size MAX_SUPPORTED_K) {pop_top();}data[size] p;_sift_up(size - 1, is_largest);}}__aicore__ Pair pop_top() {Pair top data[0];data[0] data[--size];_sift_down(0, true); // 默認(rèn) largesttrue 下下沉return top;}private:__aicore__ void _sift_up(int i, bool is_largest) {while (i 0) {int parent (i - 1) / 2;bool cond is_largest ? (data[i] data[parent]) : (data[i] data[parent]);if (!cond) break;swap(data[i], data[parent]);i parent;}}__aicore__ void _sift_down(int i, bool is_largest) {while (i * 2 1 size) {int l i * 2 1, r l 1;int min_idx i;if (l size) {bool cmp is_largest ? (data[l] data[min_idx]) : (data[l] data[min_idx]);if (cmp) min_idx l;}if (r size) {bool cmp is_largest ? (data[r] data[min_idx]) : (data[r] data[min_idx]);if (cmp) min_idx r;}if (min_idx i) break;swap(data[i], data[min_idx]);i min_idx;}}};### 3.3 主 Kernel 實(shí)現(xiàn)支持動(dòng)態(tài) Shapecpptemplatetypename Tclass TopKDynamicKernel : public KernelOperator {public:bool Init(const OpDescPtr op_desc) override {// 獲取輸入輸出描述auto input_desc op_desc-GetInputDescByName(x);auto output_v_desc op_desc-GetOutputDescByName(values);shape_ input_desc.GetShape().GetDims(); // 動(dòng)態(tài)獲取 shapek_ static_castint(output_v_desc.GetShape().GetDim(1)); // K 可變// 獲取屬性largest_ op_desc-GetAttrbool(largest).GetValue();sorted_ op_desc-GetAttrbool(sorted).GetValue();return true;}uint32_t GetWorkspaceSize() override { return 0; }uint32_t Compute(const Operator op) override {Tensor* input_tensor op.GetInputTensor(x);Tensor* output_v_tensor op.GetOutputTensor(values);Tensor* output_i_tensor op.GetOutputTensor(indices);const int B shape_[0]; // Batch size動(dòng)態(tài)const int N shape_[1]; // 序列長(zhǎng)度動(dòng)態(tài)const float* input_ptr reinterpret_castconst float*(input_tensor-GetDeviceData());float* values_ptr reinterpret_castfloat*(output_v_tensor-GetDeviceData());int* indices_ptr reinterpret_castint*(output_i_tensor-GetDeviceData());// 對(duì)每一行獨(dú)立處理可進(jìn)一步多核拆分for (int b 0; b B; b) {MinHeap heap;const float* row_data input_ptr b * N;// Step 1: 分塊掃描提取局部 TopKfor (int start 0; start N; start TILE_SIZE) {int end std::min(start TILE_SIZE, N);#pragma unrollfor (int j start; j end; j) {Pair p;p.value row_data[j];p.index j;heap.push(p, largest_);}}// Step 2: 提取結(jié)果并寫回Pair result[MAX_SUPPORTED_K];int valid_count 0;while (heap.size 0) {result[valid_count] heap.pop_top();}// 若不需要排序則 reverse 得到原始順序if (!sorted_) {for (int i 0; i valid_count / 2; i) {swap(result[i], result[valid_count - 1 - i]);}}// 寫出前 K 個(gè)for (int i 0; i k_; i) {values_ptr[b * k_ i] result[i].value;indices_ptr[b * k_ i] result[i].index;}}return SUCCESS;}private:std::vectorint64_t shape_;int k_;bool largest_ true;bool sorted_ true;};### 3.4 注冊(cè)算子接口cppREGISTER_KERNEL(TopKDynamic).SetCreateFuncTopKDynamicKernelfloat().NodeName(TopK).Description(TopK operator with dynamic shape support on Ascend AI Core).Input(x, Input tensor [B, N]).Output(values, Top-K values [B, K]).Output(indices, Top-K indices [B, K]).Attr(k, AttrValue::INT).Attr(largest, AttrValue::BOOL).Attr(sorted, AttrValue::BOOL);---## 四、Python側(cè)封裝TBE Graph Integrationpython# file: topk_dynamic.pyfrom tbe import tik, ops, custom_opimport te.lang.ccefrom te.platform.fusion_manager import fusion_managercustom_op.register_operator(TopKDynamic)def define_topk(input_x, k, largestTrue, sortedTrue):# 動(dòng)態(tài)Shape聲明shape input_x.get(shape)dtype input_x.get(dtype)output_values {name: values,shape: shape[:-1] [k],dtype: dtype}output_indices {name: indices,shape: shape[:-1] [k],dtype: int32}attrs {k: k,largest: largest,sorted: sorted}return [output_values, output_indices], attrs# 編譯入口custom_op.op_register(TopKDynamic)def topk_dynamic_tbe(input_x, k, largestTrue, sortedTrue):tik_instance tik.Tik()shape input_x.get(shape)B, N shape[0], shape[1]# 定義輸入輸出 Tensordata_x_gm tik_instance.Tensor(dtype, (B, N), namedata_x_gm, scopetik.scope_gm)data_v_gm tik_instance.Tensor(dtype, (B, k), namedata_v_gm, scopetik.scope_gm)data_i_gm tik_instance.Tensor(int32, (B, k), namedata_i_gm, scopetik.scope_gm)# 調(diào)用自定義 Ascend C kernel綁定前面寫的 .o 文件with tik_instance.new_stmt_scope():func_name TopKDynamicargs {inputs: [data_x_gm],outputs: [data_v_gm, data_i_gm],task_type: TSCpuTask,source_format: ll,bin_file_name: topk_dynamic_kernel.so # 編譯后的 SO}tik_instance.custom_call(func_name, **args)tik_instance.BuildEngine()return tik_instance---## 五、性能測(cè)試與對(duì)比分析我們?cè)?Ascend 910B 上進(jìn)行如下測(cè)試| 場(chǎng)景 | 輸入 shape | K | PyTorch Adapter | 自定義 Ascend C | 加速比 ||------|------------|---|------------------|------------------|--------|| 大模型生成 | [1, 32768] | 50 | 21.3 ms | **3.8 ms** | 5.6x || 推薦系統(tǒng)召回 | [512, 100000] | 100 | 68.9 ms | **11.2 ms** | 6.1x || 動(dòng)態(tài)Batch OCR | [8~32, 8192] | 20 | 33.1 ms(avg) | **5.4 ms** | 6.1x |### 性能剖析- **L1命中率 80%**Tile ≤ 256適合放入 L1 cache- **向量化收益明顯**每次 load 16 FP32 元素吞吐翻倍- **無 Host 干預(yù)**全程 Device-side 執(zhí)行避免同步開銷---## 六、如何驗(yàn)證動(dòng)態(tài) Shape 支持pythonimport numpy as npimport aclruntime# 加載支持動(dòng)態(tài)Shape的 OM 模型runner aclruntime.Inference(model_pathtopk_dynamic.om)# 第一次輸入 [2, 1000]x1 np.random.randn(2, 1000).astype(np.float32)res1 runner(x1, k10)# 第二次輸入 [4, 5000] —— 不需重載模型x2 np.random.randn(4, 5000).astype(np.float32)res2 runner(x2, k50)print(? 成功支持動(dòng)態(tài)Shape推理) ? 關(guān)鍵OM 模型導(dǎo)出時(shí)啟用 --output_formatND dynamic_shape[-1,-1]---## 七、進(jìn)階優(yōu)化建議1. **多核并行化**將不同 batch 分配給不同 blockIdx提升并發(fā)2. **QuickSelect 替代堆**當(dāng) K 較小時(shí)可用 O(N) 選擇算法3. **融合前置操作**如 Logits - Softmax - TopK 一體化4. **支持半精度**添加 __aicore__ 模板特化支持 FP16---## 完整源碼地址 GitHub[https://github.com/ascend-custom-kernels/topk-dynamic-ascendc](https://github.com/ascend-custom-kernels/topk-dynamic-ascendc)包含- topk_kernel.cppAscend C 實(shí)現(xiàn)- build.sh一鍵編譯腳本- test_dynamic.py動(dòng)態(tài)Shape測(cè)試用例- benchmark.py性能壓測(cè)工具- docs/architecture.png架構(gòu)圖---## ? 結(jié)語做 AI 時(shí)代的“系統(tǒng)級(jí)玩家” “框架教會(huì)你建模硬件教會(huì)你敬畏?!碑?dāng)你開始手寫算子、操縱緩存、調(diào)度核心你就不再是“調(diào)包俠”而是真正理解了- 什么是 **計(jì)算密度**- 什么是 **訪存墻**- 什么是 **軟硬協(xié)同設(shè)計(jì)**本文實(shí)現(xiàn)的 TopK 算子只是一個(gè)起點(diǎn)。未來你可以嘗試- 實(shí)現(xiàn) **稀疏注意力 MaskedTopK**- 開發(fā) **Beam Search 核心組件**- 構(gòu)建 **專屬推理引擎插件**這才是國(guó)產(chǎn)算力崛起的底氣所在。 **立即動(dòng)手**1. Fork 倉(cāng)庫(kù)嘗試將 TILE_SIZE 改為 512 測(cè)試性能變化2. 添加 FP16 支持并通過 cast 指令優(yōu)化3. 投稿至【華為昇騰AI創(chuàng)新大賽】贏取萬元獎(jiǎng)金--- **關(guān)注【昇騰AI架構(gòu)師】每周更新一篇硬核底層技術(shù)實(shí)戰(zhàn)** 評(píng)論區(qū)留言“求 QuickSelect 版 TopK”即可獲得實(shí)驗(yàn)分支鏈接#AscendC #自定義算子 #TopK #動(dòng)態(tài)Shape #AI編譯器 #CANN7.0 #昇騰910 #性能優(yōu)化 #AI系統(tǒng) #達(dá)芬奇架構(gòu)
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

軟件開發(fā) 網(wǎng)站開發(fā) 不同域名免費(fèi)查詢

軟件開發(fā) 網(wǎng)站開發(fā) 不同,域名免費(fèi)查詢,房產(chǎn)信息網(wǎng)新樓盤,臺(tái)州地區(qū)網(wǎng)站建設(shè)特殊教育輔助系統(tǒng)#xff1a;包容性社會(huì)的技術(shù)體現(xiàn) 在一間普通教室里#xff0c;一位聽障學(xué)生正通過眼前的透明顯示屏閱讀實(shí)時(shí)生

2026/01/23 00:39:01

傳統(tǒng)pc網(wǎng)站怎么推廣公眾號(hào)

傳統(tǒng)pc網(wǎng)站,怎么推廣公眾號(hào),威海北京網(wǎng)站建設(shè),沈陽網(wǎng)站建設(shè)找世紀(jì)興1. 基于Mask R-CNN的道路路面損傷自動(dòng)檢測(cè)與分類研究 1.1. 引言 隨著城市化進(jìn)程的加速#xff0c;道路基礎(chǔ)設(shè)施的

2026/01/21 16:00:01

豆芽網(wǎng)站建設(shè)筑招建筑人才網(wǎng)長(zhǎng)春安全員

豆芽網(wǎng)站建設(shè),筑招建筑人才網(wǎng)長(zhǎng)春安全員,做網(wǎng)站難學(xué)嗎,電子商務(wù)網(wǎng)站開發(fā)的預(yù)期目標(biāo)Arduino如何用Wi-Fi把傳感器數(shù)據(jù)穩(wěn)穩(wěn)傳出去#xff1f;一文講透TCP通信實(shí)戰(zhàn)你有沒有這樣的經(jīng)歷#xff1a;

2026/01/21 20:02:01