博客 / 詳情

返回

驍龍大賽-技術分享第6期——直播問題&答疑整理(創達)

Q1:在 QAI AppBuilder 上部署 DDColor 時,常見的性能瓶頸在哪裏?有哪些優先級最高的優化手段?

A1:
主要的性能瓶頸出現在 CPU 的前處理與後處理環節。前處理中包含大量 OpenCV 操作,例如顏色空間轉換、圖像縮放、通道拆分合並等,這些操作都在CPU上執行,對於高分辨率的圖像,會消耗大量的計算資源,成為顯著的性能瓶頸。後處理同樣包含了大量的CPU計算,例如圖像縮放、顏色空間轉換、數據類型轉換與反歸一化,這些都對 CPU 壓力較大。
優先優化方向包括:

  1. 將部分前後處理遷移至 NPU/GPU :通過將前後處理的計算(如縮放、顏色空間轉換)集成到模型計算圖中,可以利用NPU或GPU的並行計算能力,減少CPU的負擔,並避免不必要的數據拷貝;
  2. 用硬件加速替代常規 OpenCV 操作;
  3. 整體採用異步處理:將整個圖像處理流程(包括前後處理和模型推理)放到一個獨立的後台線程中執行,避免阻塞UI線程,從而提升應用的響應速度和用户體驗。

Q2:快速部署 DDColor 圖像上色應用時,如何優化圖像前處理和後處理以提升用户體驗?

A2:

  1. 使用更快的圖像處理庫:對於圖像的縮放、裁剪等操作,可以考慮使用Android提供的Vulkan或OpenGL,這些API可以利用GPU進行加速;
  2. 降低圖像處理精度:嘗試圖片壓縮,在不顯著影響視覺效果的前提下,適當降低輸入圖像的分辨率;
  3. 提供實時進度反饋:
    加載動畫:在處理過程中,向用户顯示一個加載動畫或進度條
    分步加載:如果可能,可以考慮先快速顯示一個低分辨率的預覽效果,然後在後台繼續計算並替換為高分辨率的最終效果。

Q3:如果要讓 GenieChat 支持多輪對話(保持上下文),在推理與狀態管理上該如何設計以保證流暢性?

A3:
在工程實現上建議關注以下方面:

  1. 對話歷史的管理 (狀態管理)
    應用需要有一個“短期記憶”來存儲當前的對話。我們可以在在App運行時,在內存中維護一個對話列表。如果希望即使用户關閉並重新打開App後,對話歷史依然存在,就需要將對話記錄持久化存儲。可以考慮使用數據庫(如SQLite)或文件的形式,將對話保存在手機本地。
    對話歷史不能無限增長,否則會消耗過多的內存和計算資源。因此,需要設定一個“記憶窗口”,比如只保留最近的10輪或20輪對話。當對話超出這個窗口時,最早的對話就會被“遺忘”。
  2. 利用對話歷史進行推理
    在向AI模型發送請求時,不再僅僅發送用户當前説的這句話。而是需要將之前存儲的對話歷史(短期記憶)一併打包,作為背景信息發送給AI。這樣,AI才能“看到”之前的對話,理解當前的語境。

保證流暢性的優化建議:
為了避免用户在AI思考時長時間等待,可以讓AI模型以“流”的方式,一個詞一個詞地返回答案,而不是等全部答案都生成好了再一股腦地返回。這能極大地提升用户的體驗,讓對話感覺更“實時”。(目前GenieChat已經實現了這一點)
上下文壓縮(Context Pruning):當對話歷史變得很長時,全部發送給AI會增加API的調用成本和延遲。可以採用一些策略來“精簡”上下文,比如只發送最近的幾輪對話,或者對早期的對話內容進行摘要總結。
另外,QAI AppBuilder中提供的GenieAPIService本身默認也是支持多輪對話(保持上下文)的。可查看GitHub上相關文檔説明。

Q4:CLIP 在 QAI 上推理時,Batch Size 多大合適?為什麼 Batch 太大反而更慢?

A4:
通常在端側 NPU(如驍龍 HTP)上,推薦 Batch Size 設置為 1,或者較小的數值(如 4 以內)。
為什麼 Batch 太大反而慢?
這涉及端側 NPU 的架構特性,與服務器端的 GPU(如 NVIDIA A100)不同:

  1. 內存帶寬瓶頸 (Memory Bandwidth):手機等移動設備的內存(DDR)帶寬遠小於服務器顯存。當 Batch Size 增大,數據搬運(從 DDR 到 NPU 內部的高速緩存 VTCM)的時間變長。如果數據傳輸時間超過了 NPU 的計算時間,就會導致計算單元閒置等待數據,從而拖慢整體速度。
  2. SRAM (VTCM) 限制:驍龍 NPU 依賴內部的高速向量存儲器(VTCM)來極致加速。如果 Batch Size 過大,導致中間激活值(Activation)超過了 VTCM 的容量,NPU 就被迫將數據“溢出”(Spill)到較慢的 DDR 內存中,這會導致嚴重的性能下降。
  3. 延遲敏感:端側應用通常追求實時響應(Latency),而大 Batch 是為了吞吐量(Throughput)。Batch=1 能保證單次操作最快完成。

Q5:如果想在 CLIP 前增加圖像增強操作(如超分),應該插在預處理的哪個環節?是否會影響特徵效果?

A5:
增強操作應放在圖片加載之後、CLIP 標準預處理(Resize/Normalize)之前,即在 Image.openpreprocess(image) 之間。
對於效果的影響是一把雙刃劍:
這是一把雙刃劍:

  1. 正面影響:如果原圖非常模糊(例如 64x64 像素),CLIP 很難識別物體輪廓。此時做超分(Super-Resolution)恢復出細節,有助於 CLIP 提取正確的語義特徵。
  2. 負面影響:如果原圖質量尚可(例如 512x512),強行做超分或增強可能會引入偽影(Artifacts)或改變圖像的紋理分佈。CLIP 是在自然圖像上訓練的,過度的數字增強可能導致特徵向量發生偏移(Shift),使得原本能搜到的圖搜不到了。

Q6:如果圖像庫非常大(如 10 萬張圖),實時檢索時如何優化響應速度?需要全部緩存到內存嗎?

A6:建議提前離線計算所有圖像的特徵,並將它們保存到單一大文件或數據庫中。以常見的 512 維 float32 特徵為例,10 萬張圖的特徵約佔 195MB,對現代設備來説完全可以在程序啓動時直接加載到內存。在內存中進行向量點積搜索通常可在毫秒級完成,不需要額外複雜的優化。

Q7:跨平台部署時,Mac 與 Windows 的模型路徑管理有哪些坑?為什麼 Windows 打包不能在 Mac 上運行?

A7:

  1. 最大的誤區:打包出的“可執行文件”不通用
    坑點:您在 Windows 上用 PyInstaller 打包生成的 .exe 文件(或 dist 文件夾),是絕對無法直接在 Mac 上運行的。
  2. 原因:Windows 的可執行文件格式是 PE (.exe),而 Mac 是 Mach-O。PyInstaller 不是 Java 虛擬機,它打包的是當前操作系統的原生二進制文件。
  3. 解決:必須在 Mac 系統上重新運行 PyInstaller 打包命令。通常的流程是:代碼寫一套 -> 在 Windows 電腦上打個包 -> 把代碼複製到 Mac 電腦上 -> 在 Mac 上再打個包。
  4. 路徑分隔符:反斜槓 \ vs 正斜槓 /
  5. 文件名大小寫敏感 (Case Sensitivity)
  6. 凍結路徑(Frozen Path)的基準點不同
    在 PyInstaller 打包後,程序解壓資源的臨時目錄機制雖然通用,但工作目錄(CWD)的行為在 Mac App Bundle(.app)下會很奇怪。
  7. 權限與寫文件路徑
    坑點:
  8. Windows:打包後的軟件通常可以隨意在自己的安裝目錄下生成 log.txt 或緩存文件。
  9. Mac:處於安全考慮(Gatekeeper),打包好的 .app 內部通常是隻讀的,或者是簽名保護的。如果你試圖把緩存文件(比如代碼中的 image_features_cache.pkl)寫回到 .app 包的內部路徑裏,程序會閃退或報錯 Permission Denied。

Q8:在 CLIP 搜索基礎上想增加“以圖搜圖”,是不是隻需要將輸入換成圖像特徵?需要重新訓練模型嗎?

A8:是的,實現“以圖搜圖”只需用 CLIP 的圖像編碼器對查詢圖像提取特徵,再與圖庫特徵做相似度計算並排序,無需重新訓練模型。因為CLIP 的核心設計理念是 “圖文對齊”(Shared Latent Space)。
這意味着:文本編碼器輸出的向量 和 圖像編碼器輸出的向量,是在同一個數學空間裏的。

  • "一隻貓的文字向量" 和 "一張貓的照片向量" 距離是很近的。
  • 同理,"一張貓的照片向量" 和 "另一張貓的照片向量" 距離也是很近的。

實現“以圖搜圖”的步驟:

  1. 用户上傳一張查詢圖片(Query Image)。
  2. 使用image_encoder(不是 text_encoder)對這張查詢圖片進行推理,得到一個 512 維的向量 query_feature。
  3. 使用這個 query_feature 去和你的圖像庫特徵(Database Features)做點積計算相似度。
  4. 排序,返回結果。

以上內容來自2025驍龍人工智能創新應用大賽

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.