:基于 ASV 的本地開發(fā)與自動化性能監(jiān)控體系)
數(shù)據(jù)分析數(shù)據(jù)可視化大數(shù)據(jù)數(shù)據(jù)科學(xué)【免費下載鏈接】vaexOut-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 項目地址https://gitcode.com/gh_mirrors/va/vaex點擊查看免費下載Vaex 作為一個面向十億行級表格數(shù)據(jù)、以 Out-of-Core內(nèi)存外計算為核心的 DataFrame 庫性能演進始終是其開發(fā)重心。為了讓每次提交都能被量化評估Vaex 將一套完整的基準測試benchmark體系集成進倉庫以 Airspeed VelocityASV為運行引擎在專用硬件上按既定調(diào)度自動運行并把結(jié)果以 HTML 報告和歷史 JSON 數(shù)據(jù)的形式持續(xù)沉淀下來。本文以 benchmarks/README.rst 為主線結(jié)合倉庫內(nèi)真實的基準測試源碼benchmarks/目錄與調(diào)度腳本 bin/benchmark_new_commits.sh完整講解如何在本地開發(fā)/驗證基準測試、如何讓基準在專用機器上自動化運行以及如何從零搭建一臺基準測試運行機。讀完本文你將掌握 Vaex 性能基準的編寫規(guī)范、ASV 的兩種本地運行模式以及整套自動化基準管線的搭建方法。技術(shù)選型為什么是 Airspeed VelocityVaex 的基準測試統(tǒng)一由 ASVAirspeed Velocity驅(qū)動。ASV 是一個面向 Python 項目的性能基準框架核心優(yōu)勢包括環(huán)境隔離可以在獨立 Conda 環(huán)境中針對不同版本/提交運行測試避免環(huán)境污染導(dǎo)致的結(jié)果失真參數(shù)化矩陣支持params/param_names聲明參數(shù)化測試自動展開成多維測試矩陣結(jié)果歷史自動維護.asv/results/目錄下的 JSON 結(jié)果歷史便于長期追蹤性能回歸報告生成通過asv publish生成靜態(tài) HTML 報告方便發(fā)布到 Web 供團隊與社區(qū)查看。在 Vaex 倉庫中這一體系被劃分為兩個層面開發(fā)層面開發(fā)者在本地編寫、調(diào)試、試跑基準測試asv dev/asv run --python$(which python)生產(chǎn)層面專用硬件按 cron 調(diào)度自動運行bin/benchmark_new_commits.sh覆蓋master分支的新提交與bench*分支的增量提交。安裝 ASV按 benchmarks/README.rst 的說明ASV 通過 Conda 安裝conda-forge 渠道conda install -c conda-forge asv安裝后在倉庫根目錄下即可使用asv命令。注意本地開發(fā)模式并不要求創(chuàng)建專用 Conda 環(huán)境直接復(fù)用當前 Python 環(huán)境即可而生產(chǎn)機器上 ASV 會為每次基準運行創(chuàng)建獨立的新 Conda 環(huán)境詳見下文生產(chǎn)環(huán)境部分。認識 benchmarks 目錄基準測試的組織方式倉庫中的 benchmarks/ 目錄集中存放所有基準測試按功能域拆分為多個模塊文件文件覆蓋主題aggregates.py聚合操作count、mean、binby 一維/二維分箱、groupbystrings.py字符串操作capitalize、contains、regex、split、replace 等filter.py過濾后的 head / tail / countgroupby.pygroupby 聚合groupbyh2o.pyH2O 風(fēng)格的 groupby 基準hashmap.py哈希表相關(guān)基準isin.pyisin成員判斷性能sort.py排序性能export.pyHDF5 導(dǎo)出性能bookkeeping.py簿記類操作fixtures.py基準數(shù)據(jù)集生成工具所有這些模塊通過 benchmarks/init.py 組織為 ASV 可識別的基準測試集合ASV 默認遞歸發(fā)現(xiàn)bench_*目錄/文件中滿足命名約定的類與函數(shù)。編寫基準測試結(jié)構(gòu)規(guī)范與源碼解析ASV 的基準測試通常以類或帶setup屬性的函數(shù)為單位方法名以time_、peak、mem等前綴命名以區(qū)分計時/內(nèi)存等指標。下面以倉庫真實代碼為例拆解其結(jié)構(gòu)。類級元數(shù)據(jù)在 benchmarks/strings.py 中可以看到典型的類元數(shù)據(jù)聲明class Strings: pretty_name Performance of string operations version 1 timeout 3600 # in seconds param_names [ N, # number of rows to use ] params ([10**7])pretty_name基準的可讀名稱用于在 HTML 報告中展示version基準版本號改動基準邏輯時遞增ASV 據(jù)此區(qū)分新舊結(jié)果timeout單次運行的超時時間秒字符串基準因數(shù)據(jù)量大設(shè)為 3600 秒params/param_names聲明參數(shù)化矩陣。params為列表的列表與param_names一一對應(yīng)ASV 會自動生成笛卡爾積。例如 aggregates.py 中params ([10**7, 5*10**7, 10**8],)param_names [N]表示在 1 千萬、5 千萬、1 億行三種規(guī)模下各跑一遍而 isin.py 則同時參數(shù)化行數(shù) N 與候選值個數(shù) Mparams ([10**7, 5*10**7, 10**8], (1, 10, 100, 1_000, 1_000_000)) param_names [N, M]數(shù)據(jù)準備setup_cache 與 setupASV 基準類中兩個特殊方法負責(zé)數(shù)據(jù)準備setup_cache(self)只運行一次負責(zé)生成昂貴且可復(fù)用的數(shù)據(jù)結(jié)果會被 ASV 緩存。Vaex 中典型用法是調(diào)用 fixtures.py 中的生成函數(shù)確保測試數(shù)據(jù)集存在def setup_cache(self): # ensure the dataframe is generated generate_numerical()setup(self, *params)每組參數(shù)組合運行前調(diào)用一次每次計時前都會執(zhí)行負責(zé)加載 DataFrame、切片、預(yù)處理。例如 strings.py 中的 setup 將 1 億行數(shù)據(jù)集切成前 N 行并把執(zhí)行器的 buffer 劃分為 24 個分區(qū)以貼近多線程執(zhí)行場景def setup(self, N): partitions 24 df vaex.open(generate_strings()) df_vaex df[0:int(N)] df_vaex.executor.buffer_size len(df_vaex) // partitions self.df df_vaex而 aggregates.py 的 setup 還會預(yù)先對多個整數(shù)列執(zhí)行categorize把連續(xù)整數(shù)映射為類別用于模擬 groupby/binby 常見的類別列場景self.df.categorize(self.df.i8_10, min_value5, max_value15, inplaceTrue) self.df.categorize(self.df.i8_1K, min_value5, max_value1_0005, inplaceTrue) self.df.categorize(self.df.i8_1M, min_value5, max_value1_000_0005, inplaceTrue)計時方法以 time_ 為前綴每個time_方法即一條獨立的計時基準。以 strings.py 為例它覆蓋了 20 余種字符串操作的性能例如def time_capitalize(self, N): self.df.s.str.capitalize().nop() def time_contains_regex(self, N): self.df.s.str.contains(9, regexTrue).nop() def time_replace_regex(self, N): self.df.s.str.replace(1?[45]4, 1004, regexTrue).nop() def time_split_and_join(self, N): self.df.s.str.split(.).str.join(-).nop()注意這里的nop()是 Vaex 提供的執(zhí)行但不返回結(jié)果的方法用于強制觸發(fā)完整的表達式求值否則惰性求值下表達式可能不會真正執(zhí)行從而測得真實的端到端耗時。聚合與過濾類基準同理例如 aggregates.py 中的一維/二維分箱計數(shù)def time_count_x_binby128(self, N): self.df.count(x, binbyx, limits[-1, 1], shape128) def time_count_star_x4(self, N): self.df.count(binby[self.df.x4, self.df.y4], limits[-1, -1], shape128)函數(shù)式基準export.py 的寫法除了類ASV 也支持函數(shù)式基準。在 export.py 中可以看到一種更輕量的寫法通過給函數(shù)設(shè)置.setup、.params、.param_names屬性完成聲明def time_export_plain(N, M): with tempfile.TemporaryDirectory() as tmpdir: df.export_hdf5(os.path.join(tmpdir, bench.hdf5)) time_export_plain.setup setup_df time_export_plain.params [[1024**2, 1024**2*16], [1, 4, 16]] time_export_plain.param_names [N, M]setup_df負責(zé)構(gòu)造 N 行、M 列的浮點 DataFrametime_export_plain則把整個 DataFrame 導(dǎo)出為 HDF5衡量 1 列 / 4 列 / 16 列場景下的序列化吞吐。函數(shù)式寫法更適合單一、自包含的基準類寫法則適合共享數(shù)據(jù)準備的成組基準。本地開發(fā)快速驗證基準測試編寫或修改基準后先用開發(fā)模式快速試跑。按 benchmarks/README.rst本地驗證的命令為# 運行某個基準套件例如 Strings只重復(fù)一次使用當前 Python 環(huán)境 asv dev --bench Stringsasv dev的特點只運行一次不進行多輪重復(fù)取中位數(shù)速度極快適合驗證基準是否可運行、結(jié)果量級是否合理復(fù)用當前環(huán)境不會創(chuàng)建新 Conda 環(huán)境避免每次驗證都要重新解析依賴--bench參數(shù)支持子串匹配例如--bench Strings只運行Strings類下的所有計時方法也可用--bench Aggregate匹配聚合相關(guān)基準。在跑asv dev之前建議先確認基準數(shù)據(jù)存在。以字符串基準為例首次運行會觸發(fā) fixtures.py 的generate_strings()在~/.vaex/benchmarks/下生成包含 1 億行strings_8.hdf5的 HDF5 數(shù)據(jù)集包含順序整數(shù)及其字符串表示兩列。數(shù)據(jù)生成后會被復(fù)用后續(xù)基準運行無需重建。本地完整運行全量基準驗證通過后可在筆記本/工作站上跑一次完整基準。同樣復(fù)用當前 Python 環(huán)境asv run --python$(which python)asv run是 ASV 的標準運行命令未加參數(shù)時默認對當前檢出代碼運行全部基準--python$(which python)明確指定使用當前 Python 解釋器而不是由 ASV 自動創(chuàng)建 Conda 環(huán)境——這保證了本地開發(fā)與生產(chǎn)環(huán)境行為一致但開銷更低默認會對每個基準進行多次重復(fù)如--repeat控制重復(fù)次數(shù)并匯總統(tǒng)計量均值、標準差等。運行結(jié)果會寫入.asv/results/目錄下的 JSON 文件中隨后可通過asv publish生成 HTML 報告用asv preview在本地瀏覽器查看趨勢圖。提示本地完整運行耗時較長strings 基準單次超時就設(shè)定了 3600 秒。建議開發(fā)階段先用asv dev --bench 你的新基準名驗證再在專用硬件上跑完整矩陣。生產(chǎn)環(huán)境自動化基準管線Vaex 的基準并非只在開發(fā)機運行而是有一套完整的自動化流程。按 benchmarks/README.rst 的描述其工作流程為cron 觸發(fā)一個 cron 任務(wù)定時調(diào)用 bin/benchmark_new_commits.sh切到 master腳本強制將工作區(qū)重置為vaex倉庫的master分支最新提交基準測試代碼一律取自master測 master 新提交先對master上尚未基準過的新提交運行基準測 bench分支*若存在bench*前綴的分支則對origin/master..origin/branch之間的增量提交運行基準——注意基準測試代碼仍取自master因此這種方式適用于改進既有基準而不適合開發(fā)新基準新基準應(yīng)合入master后再運行合并歷史將新結(jié)果與vaex-asv倉庫中歸檔的.asv/results/**/*.json合并回該倉庫并推送從而保留完整歷史發(fā)布 HTMLasv publish生成靜態(tài) HTML 并拷貝到基準機的 Web 目錄結(jié)果即可在 ASV 報告站點上公開訪問。調(diào)度腳本源碼解讀bin/benchmark_new_commits.sh 用 Bash 實現(xiàn)了上述流程幾個關(guān)鍵函數(shù)值得逐一看結(jié)果恢復(fù)——每次運行前從 vaex-asv 倉庫拉取并恢復(fù)歷史結(jié)果保證結(jié)果連續(xù)可追溯function restore_results_from_git () { # copy results from vaex-asv/.asv/results/**.json to vaex/.asv/results/**.json (cd ../vaex-asv git pull -f) (mkdir -p .asv) (mkdir -p ../vaex-asv/.asv/results/) echo Restoring the following results from vaex-asv repo: find ../vaex-asv/.asv/results/ cp -r ../vaex-asv/.asv/results/ .asv/ }分支發(fā)現(xiàn)——找出所有以bench開頭的遠端分支作為候選測試目標function get_additional_branches_to_benchmark () { # find branches which start with bench* in the origin git branch -a | grep origin/bench | sed -e s/.*origin\/\(.*\)/\1/ }主流程——支持兩種模式帶--only-last參數(shù)時只測master最新一個提交用于機器初始化驗證否則測master全部新提交再對每個 bench* 分支測其相對master的增量提交if [[ $1 --only-last ]] then echo Benchmarking last commit on master asv run else echo Benchmarking new commits on master (asv run NEW) || (echo Maybe no new commits to benchmark?) for branch in $(get_additional_branches_to_benchmark) do echo Benchmarking commits on ${branch} asv run origin/master..origin/${branch} done fi # generate HTML asv publish store_and_push_results_in_git copy_results_to_www其中asv run NEW中的NEW是 ASV 對自上次運行以來新增提交的引用名配合--set-commit-hash可將結(jié)果掛到具體提交上asv run origin/master..origin/branch用 git 的 range 語法圈定要測的提交范圍asv publish把 JSON 結(jié)果聚合為 HTML 報告store_and_push_results_in_git將結(jié)果拷貝回 vaex-asv 倉庫并git commitgit push完成歷史歸檔copy_results_to_www把.asv/html/*拷貝到/var/www/asv.vaex.io/html/即 Web 服務(wù)器根目錄供外部訪問。從腳本可以看到整個管線刻意保持了主倉庫 獨立結(jié)果倉庫vaex-asv的分離vaex主倉庫只包含基準代碼性能歷史數(shù)據(jù)全部沉淀在 vaex-asv 倉庫中避免主倉庫因頻繁寫入結(jié)果 JSON 而膨脹。從零搭建基準運行機初始設(shè)置 8 步benchmarks/README.rst 給出了一套完整的新機器初始化清單可用于搭建新的專用基準運行機1. 創(chuàng)建專用 Unix 用戶例如github讓基準運行與日常操作隔離。2. 配置 SSH 部署密鑰生成 SSH key并將其添加為 vaex-asv 倉庫的 Deploy key使該用戶具備推送結(jié)果提交的權(quán)限。3. 克隆兩個倉庫git clone gitgithub.com:vaexio/vaex.git git clone gitvaexio/vaex-asv.git # 結(jié)果歸檔倉庫實際地址以你的配置為準4. 配置 git 提交身份用于生成基準結(jié)果提交git config --global user.name Vaex GitHub Integration git config --global user.email githubvaex.io5. 安裝 Miniconda 并安裝 ASVconda install asv -c conda-forge6. 配置機器參數(shù)運行asv machine將 CPU 型號、核數(shù)、內(nèi)存等硬件信息寫入~/.asv-machine.json。這一步很關(guān)鍵——ASV 依賴該文件識別運行機并據(jù)此在結(jié)果中標注機器標識。7. 首次試跑執(zhí)行bin/benchmark_new_commits.sh --only-last只對master最新提交跑一次基準確認管線端到端可用并初始化結(jié)果歷史。8. 注冊 cron 定時任務(wù)例如每 8 小時運行一次。在crontab -e中寫入PATH/home/github/miniconda3/bin:/home/github/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 */8 * * * /home/github/vaex/bin/benchmark_new_commits.sh /home/github/log/benchmark-run-$(date \%Y-\%m-\%d_\%H-\%M-\%S).log 21注意 cron 行中的兩個要點PATH 必須顯式寫出cron 環(huán)境 PATH 極簡不包含 Miniconda 的 bin 目錄若不配置則asv、conda等命令將無法執(zhí)行日志重定向把 stdout/stderr 重定向到帶時間戳的日志文件date格式中的%需在 cron 中寫成\%轉(zhuǎn)義方便事后排查某輪運行是否失敗。另外建議先mkdir /home/github/log/創(chuàng)建日志目錄。生產(chǎn)環(huán)境下ASV 每次運行都會創(chuàng)建新的 Conda 環(huán)境基于asv.conf.json或倉庫聲明的依賴矩陣保證不同運行之間的依賴環(huán)境可復(fù)現(xiàn)、可比對?;鶞蕯?shù)據(jù)集fixtures 的生成邏輯基準的可復(fù)現(xiàn)性依賴固定的測試數(shù)據(jù)。benchmarks/fixtures.py 提供了兩個生成函數(shù)數(shù)據(jù)文件統(tǒng)一落在~/.vaex/benchmarks/私有目錄下已存在則跳過生成generate_strings()生成 1 億行字符串數(shù)據(jù)strings_8.hdf5一列為順序整數(shù)一列為整數(shù)的字符串表示。生成后還會shuffle()打亂順序再導(dǎo)出模擬真實數(shù)據(jù)的隨機分布nmax 8 filename fstrings_{nmax}.hdf5 path os.path.join(vaex.utils.get_private_dir(benchmarks), filename) if not os.path.exists(path): x np.arange(0, int(10 ** nmax)) s x.astype(str) df_vaex vaex.from_arrays(xs, ss) df_vaex.shuffle().export(path, progressFalse)generate_numerical()生成數(shù)值基準數(shù)據(jù)numerical_8-b.hdf5設(shè)計了一套分層測試矩陣x/yfloat64標準正態(tài)分布x4/y4為其 float32 版本用于對比精度對性能的影響iB_1010 個在 515 之間的隨機整數(shù)B ∈ {1,2,4,8}對應(yīng) int8 到 int64用于測試小基數(shù)分箱/分組iB_100100 個 5105 的隨機整數(shù)iB_1K1000 個 51005 的隨機整數(shù)int16 起iB_1M100 萬個 51,000,005 的隨機整數(shù)int32 起用于測試高基數(shù)分組時的哈希表性能。i10 np.random.randint(5, 10 5, N, dtypenp.int64) i100 np.random.randint(5, 100 5, N, dtypenp.int64) i1K np.random.randint(5, 1000 5, N, dtypenp.int64) i1M np.random.randint(5, 1_000_000 5, N, dtypenp.int64)從源碼可以推斷這套數(shù)據(jù)刻意覆蓋基數(shù)從 10 到 100 萬跨五個數(shù)量級 整數(shù)位寬從 8 到 64 位跨四個檔位的組合從而系統(tǒng)性地檢驗 Vaex 在不同哈希密度下的分組、分箱、isin、去重等核心算子性能。例如 aggregates.py 的BinByCat1M類就只對 4 字節(jié)與 8 字節(jié)的 100 萬基數(shù)列做分箱測試params Aggregates.params ([4, 8],)isin.py 則將候選集合大小從 1 一直參數(shù)化到 100 萬觀察isin在哈希表擴展過程中的行為。常見基準場景一覽結(jié)合源碼可以梳理出 Vaex 基準覆蓋的核心性能面便于你定位與擴展字符串處理strings.py大小寫轉(zhuǎn)換、trim、補齊、正則匹配/替換、split/join、子串定位等 20 個計時方法全部基于 1 億行字符串列聚合與統(tǒng)計aggregates.pycount()、均值、一維/二維 binbyshape128、按不同基數(shù)類別列分箱GroupBygroupby.py、groupbyh2o.py按 100 基數(shù)、100 萬基數(shù)及 2 的冪次列分組計數(shù)過濾后訪問filter.py構(gòu)造布爾過濾后的 DataFrame測head()、tail()、count()的緩存命中性能成員判斷isin.py數(shù)值與字符串列的isin參數(shù)化候選集大小導(dǎo)出export.py不同行列規(guī)模的 HDF5 導(dǎo)出吞吐含相關(guān)列sum派生列導(dǎo)出場景。結(jié)語Vaex 的基準測試體系是一個本地可迭代、線上可監(jiān)控的完整閉環(huán)本地用asv dev與asv run --python$(which python)快速開發(fā)和驗證基準生產(chǎn)環(huán)境則由 cron 驅(qū)動 bin/benchmark_new_commits.sh對master與bench*分支的新提交自動執(zhí)行基準、把結(jié)果歸檔到獨立結(jié)果倉庫、并發(fā)布為靜態(tài) HTML 報告。如果你正在為 Vaex 貢獻性能優(yōu)化或新增基準推薦的實操路徑是閱讀 benchmarks/fixtures.py 理解現(xiàn)有數(shù)據(jù)集設(shè)計 → 參照 benchmarks/strings.py 或 benchmarks/aggregates.py 的類結(jié)構(gòu)編寫新基準 → 用asv dev --bench 你的基準名快速驗證 → 合入master后由專用硬件接管長期監(jiān)控。這樣既能保證每次提交的性能變化被及時發(fā)現(xiàn)也能讓社區(qū)的每一項性能工作都有數(shù)據(jù)可依。贊分享數(shù)據(jù)分析數(shù)據(jù)可視化大數(shù)據(jù)數(shù)據(jù)科學(xué)【免費下載鏈接】vaexOut-of-Core hybrid Apache Arrow/NumPy DataFrame for Python, ML, visualization and exploration of big tabular data at a billion rows per second 項目地址https://gitcode.com/gh_mirrors/va/vaex點擊查看免費下載相關(guān)推薦DGL 性能基準測試完全指南ASV 持續(xù)基準體系、本地復(fù)現(xiàn)與歷史性能解讀DGL 性能基準測試完全指南ASV 持續(xù)基準體系、本地復(fù)現(xiàn)與歷史性能解讀 本文圍繞 DGL 官方性能文檔 docs/source/performance.r人工智能機器學(xué)習(xí)深度學(xué)習(xí)圖計算NetworkX 性能基準測試指南基于 ASV 的基準套件配置與運行實踐NetworkX 性能基準測試指南基于 ASV 的基準套件配置與運行實踐 導(dǎo)讀 本指南圍繞 NetworkX 倉庫中的 benchmarks/README.m圖計算數(shù)據(jù)分析科學(xué)計算3 步裝好 Zola kirifuji 博客主題安裝、配置與導(dǎo)航定制3 步裝好 Zola kirifuji 博客主題安裝、配置與導(dǎo)航定制 想讓 Zola 博客換成極簡紫色風(fēng)kirifuji 屬于裝完就能用的那檔。本文帶你走完靜態(tài)站點CLI開發(fā)工具上一篇RT-DETR 2025終極指南動態(tài)卷積技術(shù)深度解析與實戰(zhàn)應(yīng)用下一篇如何解決Universal_Robots_ROS2_Driver常見問題開發(fā)者必看的調(diào)試指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考