日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Boxx:一个旨在提高 Python 代码开发和调试效率的工具库,尤其在计算机视觉领域...

發布時間:2023/12/31 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boxx:一个旨在提高 Python 代码开发和调试效率的工具库,尤其在计算机视觉领域... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹一個Python 工具包 boxx

在調試視覺代碼時, 基本就是和多維數組打交道, 多維數組有很多的屬性,打印起來比較麻煩。 boxx.loga 可以一次性展現出一個數組的大多數屬性.

? Note:

  • loga 是 "log array" 的縮寫, 若 array 里面還含有 nan 或 inf, loga 也會一并提示出來。
  • loga 支持許多可以轉為 numpy 的數據類型,包括 torch.tensor, mxnet.ndarray, PIL.Image 等。

做計算機視覺,可視化圖像和 feature 非常重要。boxx.show 能方便地做可視化。


? Note: show 會在復雜的數據結構中 找出所有可能是圖像的矩陣,并一一顯示(plt.imshow)出來。 當然,show 也支持 numpy,torch,mxnet,PIL.Image .etc

在開發 CV 代碼時,會遇到一些復雜的 dict,list(比如 batch、模型參數)。boxx.tree 可以直觀地展示復雜結構。

? Note: 在理解和適配別人的代碼時,經常用到 tree。tree 還支持自動從 torch.Dataloader/Dataset 中 sample 一個 batch 來可視化 (P.S. boxx.show 也支持)


以上三個工具是我在視覺領域經常用到的工具, 接下來介紹一些通用的 Python 開發調試工具,只要寫 Python 代碼,都可以用上。

打印變量是最簡單、直接的debug方式, 那能不能更簡單?

? Note: boxx.p 使用了 magic method, p/x 便會打印 x 并返回 x。這樣便可以在任何地方打印,比如 例子中的 p/randint(0, 3) 就不需要新建變量便可直接打印

在函數內運行 p(),便會將函數或 module 內的所有變量名和值一同打印(相當于快捷打印 locals())

? Note: 在函數內 import boxx.p 和 p() 有相同的效果

許多數情況下, 直接 print 無法獲得調試的關鍵信息。 比如訓練 loss 跑飛了, 導致 Bug 的可能是 tensor 的尺度/類型不對, 矩陣里有 nan , inf 等情況。我曾遇到過 梯度含有nan 的情況

這時 就必須對矩陣進行分析, 方式有:

  • 在調試處加上 print(x.mean(), np.hasinf(x),.np.hasnan(x))
  • 設置斷點進行分析
  • 方法1 每改一次調試代碼 都要運行整個代碼, 不靈活,操作也繁瑣。
    方法2 中進入和退出 Debug console 比較麻煩,Debug console 本身也不太好用(沒有自動補全功能)
    boxx.g 提供了一種新的方式,通過 g.name 可以將變量傳到當前的 Python 交互終端

    變量傳到 Python 終端后,就能對變量進行全面分析了,比如 使用 loga,tree 來分析

    ? Note:

    • gg 的意思是 to Global and log, 和 g 的用法一樣, 但 gg 會在傳輸的同時打印變量.
    • 需要注意, 如果之前在終端中存在一樣的變量名稱,則變量的值會被新值覆蓋.

    在函數內運行 g(),便會將函數 (或 module) 內的所有變量一同傳到當前的 Python 交互終端

    這樣 任何錯誤都可以在終端中復現和分析了。當然, 注意不要覆蓋重要的全局變量。

    ? Note: 在函數內 import boxx.g 和 g() 有相同的效果

    在實際開發調試中, 函數或 module 內可能含有非常多的變量 但我們只對幾個變量感興趣, with p, with g, with gg 可以使操作只作用于幾個感興趣的變量,只需把變量放入 with 結構中即可 :


    ? Note:

    • with p, with g, with gg 只作用于在 with 結構中進行賦值操作的變量.
    • 如果變量名在 with 前存在于 locals() 中, 同時 id(變量) 沒有變化 , with 結構可能無法檢測到該變量.

    總結一下,boxx 的調試工具可以匯總為一個表

    boxx 調試工具矩陣

    變量個數 \ 操作printtransportprint & transport
    單變量p/xg.name/xgg.name/x
    多變量with p:with g:with gg:
    locals()p()g()gg()
    locals()_2import boxx.pimport boxx.gimport boxx.gg

    ? Note:

    • transport 操作是指 把函數內的變量傳送到 Python interactive console 中
    • locals() 指 作用于函數或 module 內的所有變量
    • locals()_2: 當 boxx 未導入時, import boxx.{操作} 能等價于 from boxx import {操作};{操作}()

    在學習新框架或適配大佬代碼時,經常會使用 print(x), dir(x), help(x), type(x) 來了解某個變量的各方面的信息 (變量可能是 值/function/class/module 等),于是我寫了一個 boox.what(x) 來全面了解"what is x?":


    ? Note: what(x) 通過打印 x 自己及x 的 文檔, 父類繼承關系, 內部結構所有屬性 來全面了解 x. 是 help(x) 的補充.


    說了這么多調試 再說一下性能調優

    測試代碼性能時,計時很常用, 我寫了一個方便的計時工具boxx.timeit 將想要計時的代碼塊放入 with timeit(): 中就可以計時了:

    此外 SnakeViz 是一個很棒的性能分析工具,SnakeViz 能夠通過 cProfile 文件,來統計代碼的函數調用情況,并可視化出代碼的 火焰圖。但是, 先生成 cProfile 文件,再運行 SnakeViz 的流程非常繁瑣,我把這一套操作封裝成了 boxx.performance 來簡化流程:

    ? Note: performance 也支持字符串形式的 Python 代碼.

    如今的數據集都數百上千 GB,在數據清洗和預處理時 要寫多進程的 Python 代碼 來榨干 CPU 的每一個線程獲得加速。但我覺得 Python 多進程的幾個范式都不夠方便,我參照 map 的思想和用法把多進程操作封裝成 boxx.mapmp 函數(意思是"Map for Mulit Processing"). mapmp 和 map 有一樣的用法, 只需把 map 替換為 mapmp 即可獲得多進程加速:


    ? Note:

    • mapmp 的 pool 參數來控制進程數目,默認為 CPU 線程數目.
    • 在多進程程序中, 打印進度往往非常麻煩. mapmp 的 printfreq 參數能解決這個問題.
    • 如同 map 一樣,mapmp 支持將多個參數輸入函數,如mapmp(add, list_1, list_2)
    • 在 Python 中,多進程代碼最好在 __name__ == '__main__' 環境中運行.
    • 如果加速 numpy 程序,請注意 在 MKL 版本的 numpy 中,多進程會更慢, 可以運行 boxx.testNumpyMultiprocessing() 來測試當前環境對多進程 numpy 的友好程度

    當要下載 url 形式的數據集或網絡爬取圖片時,多線程編程對這類高IO操作會很有用。boxx 還有個多線程版本的 map -- mapmt (意思是 "Map for Mulit Threading")。mapmt 用法和 mapmp 一樣, 但沒有多進程的諸多限制。


    再分享一下我自己在寫視覺代碼的感受吧

    由于我自己

  • 寫 CV 代碼離不開強大的 Qt console for IPython
  • 受不了遠程編輯對網絡的依賴和延遲
  • 所以 一直用 Anaconda 自帶的 Spyder 作為 Python 開發的 IDE. Spyder 雖然不夠強大,但自帶的 Qt-IPython, 配合自己寫的工具,調試起來還是比較方便, 順手。所以, 我開發的工具都盡可能地直接, 簡潔,上面介紹的大部分工具都支持 func-x 來代替 func(x) 以方便調試時調用。甚至,我還寫了一些字符串處理工具,直接在IPython 內使用, 以彌補 Spyder 作為 IDE 的不足。

    此外,我的工作流一般是 先在本地開發調試, 用 boxx.sysi 檢測運行環境來自動切換運行參數, 本地開發調試 OK 了, 用 rsync 命令 只傳改過的 .py 文件到服務器 再來 train。雖然這樣傳代碼比較麻煩, 但開發, 調試起來會方便很多。

    之前在實驗室一直是本地 GPU 環境調試 比較方便。實習后, 曠廠不提供本地 GPU。我主力是 PyTorch, 為了方便調試 我寫了個 boxx.ylth 包,如果檢測到沒有 CUDA 環境,boxx.ylth 會強行使 .cuda() 和大部分 GPU 操作無效。只要在代碼開頭 import boxx.ylth 大多數只基于 GPU 的 torch 代碼, 可以不經更改 直接在 CPU 上運行和調試。(這操作太暴力 請慎用)


    GitHub 主頁:github.com/DIYer22/box…

    安裝:pip install git+https://github.com/DIYer22/boxx (其他安裝方法及說明)

    教程:boxx 的教程是一個可執行的在線 Notebook。 也就是說,無需下載和運行任何代碼,只需瀏覽器點擊下面的鏈接,就可以在線執行 Notebook 教程中的代碼塊。
    => 可直接執行的在線教程

    最后 特別感謝徐曉棟、吳國棟、范浩強和熊鵬飛對 boxx 提出的建議。

    轉載于:https://juejin.im/post/5b2b87d6e51d4558c100e395

    總結

    以上是生活随笔為你收集整理的Boxx:一个旨在提高 Python 代码开发和调试效率的工具库,尤其在计算机视觉领域...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。