全自動化的抖音啟動速度測試

williamfzc發表於2020-02-12

前言

背景

我來啦,感謝社群的朋友們對這個專案的支援,這次有機會到MTSC2019深圳站上分享。雖然講得還不夠好,但是對自己也是一次難得的歷練機會。
開發維護至今,很開心能得知,已經有不少團隊將該工具落地到實際專案中,其中不乏來自各大廠的業務團隊們。這也是開源專案的意義之一。

當然,隨著使用範圍增大,功能更加複雜,我們也在不斷改進與優化這個工具。目前,stagesepx已經迭代了35個版本,穩定性與功能比起之前也不可同日而語。
在啟動速度測試這一塊上,應用已經趨向穩定。因此,本文將針對這一項,進行一個完整例子的講解。

起因

其實,對於一般應用來說,可以參考前言中 如何手動或自動進行app的啟動速度測試 的方式去做就可以。之所以會有這麼一項,是因為:

  • 一些超級app的啟動過程非常複雜且可變
  • 無法滿足遊戲的需求

簡而言之,也就是部分同學最關心的動態化問題。舉個例子,抖音的啟動過程是這樣的:

可以看到,它有五個階段(你也可以按照你的理解劃分):

  1. 初始階段(app沒開啟)
  2. 首屏(抖音字樣)
  3. 插屏廣告(可能有)
  4. 應用內首屏(視訊未載入,但主體控制元件已載入完成)
  5. 應用完成(視訊與控制元件均以載入完成)

看起來還好,但是:

  • 插屏廣告每次開啟都不一樣,且不一定有
  • 抖音的主頁是動態的,會大面積動,而且每次都不一樣

由於模型的限制,之前的 stagesepx 沒法滿足這個問題,所以,這類問題也成為它應用的瓶頸。
本篇文章將以抖音為例(此條五毛),描述現在的版本如何處理複雜情況下的啟動速度測試問題。

這裡選抖音只是因為抖音的啟動流程夠複雜,方便講解

流程

所有程式碼可以在 例子地址 找到。

場景設計

對於測試來說,場景與過程設計永遠是最重要的。如果標準都沒有定下來,操作沒有任何意義。
這裡我們的規劃保持與上面相同,五個階段。另外在本次測試中我們姑且認為:

應用完成的首點 - 初始階段的結束點 = 啟動耗時 (這裡自行根據實際需要去界定)

操作

這裡請先閱讀 如何手動或自動進行app的啟動速度測試 中的自動測試部分,操作流程差不多。這裡不會贅述

與上文一樣,我們可以利用幾個視訊,得到一系列的截圖。通過人工分揀,我們可以將截圖按我們上面設計好的類別進行歸類。訓練集大概是這樣:

然後一樣的,我們在上面進行訓練就可以得到我們想要的模型。
看起來與傳統模式非常相似,不同之處在於,在這種模式下我們不再使用傳統的SVM分類器,而改用keras支援的神經網路分類器。
當然,這一切對於使用者來說幾乎是無感知或不需要了解的,這也是我們在設計初期希望的,api保持穩定,使用者並不需要關心過多實現細節,能夠更快實現功能。

from stagesepx.classifier.keras import KerasClassifier


data_home = "./dataset"
model_file = "./keras_model.h5"

cl = KerasClassifier(
# 輪數
epochs=10,
# 保證資料集的解析度統一性
target_size=(600, 800),
)
cl.train(data_home)
cl.save_model(model_file, overwrite=True)

而程式碼上的修改也僅僅是從 SVMClassifier 替換為 KerasClassifier。那麼我們就可以利用這個訓練好的模型進行預測,並得到一個字典:

OrderedDict([('-3',
[<ClassifierResult stage=-3 frame_id=63 timestamp=1.062857142857143>,
<ClassifierResult stage=-3 frame_id=64 timestamp=1.0797278911564627>,
...
('0',
[<ClassifierResult stage=0 frame_id=1 timestamp=0.01687074829931973>,
...

從這個字典中我們可以知道,每一幀分別對應的:

  • 被分類到哪一個類別
  • 時間戳
  • 幀編號
  • ...

那麼理論上,我們可以由下一段指令碼來處理這些結果,達到自動計算的目的。回到我們一開始的設計:

應用完成的首點 - 初始階段的結束點 = 啟動耗時

對應到我們分好的類別(0、1、2、3、4),就是:

階段4[0] - 階段0[-1] = 啟動耗時

即可自動計算出耗時。在此基礎上,你可以根據實際需要進行額外的擴充套件,例如部署到jenkins上使其定時執行。

一些問題

看起來好像跟普通版本沒什麼變化,為什麼要用keras分類器?

神經網路的介入主要為了強化分類的普適性。例如,抖音的插屏廣告可能形態各異,而他們在被分類時又應該被分到同一個類別。讓SVM完成這項任務未免有些強人所難。

訓練完的模型效果並不好

動態情景下最大的問題是,每個階段的表現可能是不相同的。以插屏廣告為例,每次開啟時插屏廣告都不一樣,此時我們需要擴大訓練集,儘量讓模型找到廣告之間的共性,能夠正確地將他們劃分到同一類別。

對於抖音的例子,我這邊大概用了四個視訊作為訓練集,此後的預測基本可以滿足要求。當然對於真實的業務來說,你完全可以繼續增大你的訓練集,使其穩定性更強。

切換到keras,效能是否有影響?對硬體(GPU)是否有要求?

誠然,神經網路的計算量相比之前要大許多,但並沒有想象中那麼大。

  • 模型並不複雜
  • 場景要求不高(僅做單標籤分類)
  • 訓練集很小(百級別)

在這種情況下,用cpu訓練已經足夠。參考資料:

  • 200張圖片
  • epoch = 10
  • MacBook Pro 2019 16g
  • 耗時3分鐘左右
  • 最終accuracy: 0.9871

除此之外,在切換到神經網路之後,雖然在訓練過程上我們需要花費更多的時間,但分類的效率被極大地提高了。總的來說,這個結果是非常積極的。

最後

任何建議與意見可以留言或到主庫留issue~

https://github.com/williamfzc/stagesepx

相關文章