我們推出了一個(gè)新的系列,對(duì)PytorchConference2023 的博客進(jìn)行中文編譯,會(huì)陸續(xù)在公眾號(hào)發(fā)表。
你好,我叫塞爾吉。我在Meta公司負(fù)責(zé)PyTorch的開發(fā)者體驗(yàn)。今天我想要談?wù)凾orchFix。
TorchFix是我們最近開發(fā)的一個(gè)新工具,旨在幫助PyTorch用戶維護(hù)健康的代碼庫并遵循PyTorch的最佳實(shí)踐。首先,我想要展示一些我們努力解決的問題的示例。
For Cholesky decomposition - torch.cholesky deprecated in favor of torch.linalg.cholesky - Replace torch.cholesky(A) with torch.linalg.cholesky(A) - Replace torch.cholesky(A,upper=True)with torch.linalg.ch
首先是第一個(gè)示例。最近,PyTorch的API中計(jì)算Cholesky分解的函數(shù)發(fā)生了改變。將該函數(shù)從torch.shalesky移動(dòng)到torch.linauk.shalesky,并且參數(shù)也進(jìn)行了變更。在舊的API中,您可以提供upper equals true參數(shù),但在新的API中,您只需計(jì)算一個(gè)聯(lián)合。我們希望更新我們的代碼以使用這個(gè)新的API。但是手動(dòng)操作這個(gè)過程非常繁瑣。
- Bad: param.require grad = False - Good: param.requires grad = False (notice 'requires') The bad code doesn't cause any explicit errors but doesn't do what it's supposed to do
有時(shí),出于性能原因,您不想為參數(shù)計(jì)算梯度。要告訴PyTorch您不需要梯度,只需將requires grad屬性設(shè)置為false。不幸的是,人們會(huì)經(jīng)常會(huì)輸入require gradient, requiregrad false。又因?yàn)檫@個(gè)是python,屬性動(dòng)態(tài)創(chuàng)建沒有錯(cuò)誤,你的程序繼續(xù)工作但沒有執(zhí)行預(yù)期的操作,這可能會(huì)導(dǎo)致性能下降。這實(shí)際上很難注意到,我們?cè)诙鄠€(gè)流行的大型開源庫發(fā)現(xiàn)了這個(gè)問題。
- Synchronized dataloader torch.utils.data.DataLoader(dataset,batch_size=10) - For efficiency in production torch.utils.data.DataLoader(dataset,batch_size=10,num_workers=n)
關(guān)于數(shù)據(jù)加載器的另一個(gè)問題是,如果你沒有為數(shù)據(jù)加載器提供"numWorkers"參數(shù),那么默認(rèn)值為零。這意味著數(shù)據(jù)加載將在與計(jì)算相同的進(jìn)程中進(jìn)行。數(shù)據(jù)加載可能會(huì)阻塞計(jì)算。因此,出于效率原因,您希望在生產(chǎn)環(huán)境中提供"numWorkers"參數(shù),并將其設(shè)置為大于零的值。具體的數(shù)字可能取決于您擁有的CPU數(shù)量或其他因素。但這個(gè)問題不一定是一個(gè)錯(cuò)誤。根據(jù)您的目標(biāo)和代碼的運(yùn)行方式,默認(rèn)值0可能是完全有效的。但是,我們?nèi)匀幌M蛴脩魳?biāo)記此問題,以便用戶可以檢查和理解它是否對(duì)他們?cè)斐闪藢?shí)際問題。
TorchVision introduced new Multi-weight support API Replace models.resnet101(pretrained=True) with models.resnet101(weights=models.ResNetl01_Weights.IMAGENET1K_V1)
這個(gè)例子與核心PyTorch無關(guān),而是與一種流行的領(lǐng)域庫TorchVision有關(guān)。
最近,TorchVision中加載預(yù)訓(xùn)練權(quán)重的API發(fā)生了變化。所以以前你提供的是Pretend等于true或等于false。但是使用新的API,你需要提供weight參數(shù),并明確指定要加載的權(quán)重。這個(gè)新的API更加靈活,我們希望更新我們的代碼來使用它。實(shí)際上,我們希望全世界的代碼都能更新使用這個(gè)新的API。在那之后,TorchVision可以完全停止支持舊的API。再次強(qiáng)調(diào),手動(dòng)做這個(gè)過程非常繁瑣。特別是考慮到TorchVIsion不只有一個(gè)模型,TorchVision有許多模型和許多權(quán)重,這個(gè)API的變化適用于所有模型。
: A specialized static analysis tool for Pythoncode Uses LibcsT - A concrete syntax tree parser and serializer library for Python - Similar to standard Python's ast, but.preserves things like comments and formatting - https://github.com/Instagram/LibCST
如果有什么是解決所有這些問題的方法,它就是TorchFix。TorchFix是一個(gè)專門為PyTorch設(shè)計(jì)的靜態(tài)分析工具。他們使用了Lipcea ST這個(gè)流行的庫。Lipcea ST允許TorchFix加載、獲取語法樹、更新語法樹,然后將修改后的語法樹寫回。關(guān)于如何運(yùn)行TorchFix,有兩種模式。一種是作為Flake8插件,另一種是獨(dú)立模式。在Flake 8插件模式中,你只需要安裝Torchfix,然后基本上使用Flake 8. 如果你的項(xiàng)目中已經(jīng)使用了Flake 8,這種模式非常方便。如果你的CI正在運(yùn)行Flake 8,你只需要安裝并指定你想要處理的額外警告。但是在這種模式下,沒有自動(dòng)修復(fù),只有代碼檢查和錯(cuò)誤提示。
Two modes: flake8-plugin and standalone flake8-plugin: linting only - flake8 --select=TOR0,TOR1,TOR2 standalone: linting and autofixing - torchfix - torchfix . --fix - torchfix --select=ALL
另一種模式是獨(dú)立運(yùn)行,你可以將TorchFix作為腳本運(yùn)行,并提供相應(yīng)的參數(shù)。這張幻燈片的最后一行顯示,并不是所有規(guī)則都默認(rèn)啟用。這是因?yàn)橛行┮?guī)則太過繁雜,不能默認(rèn)啟用。若要查看所有規(guī)則和結(jié)果,你可以提供SELECT等命令
Get a release from PyPI pip install torchfix Latest code from GitHub Clone https://github.com/pytorch/test-infra/tree/main/tools/torchfix pip install .
獲取Torchfix也很簡單,你只需要從PyPy安裝Torchfix的最新版本,或者從GitHub克隆倉庫并進(jìn)行安裝。目前的階段是早期測(cè)試版(early beta),但已經(jīng)非常有用。TorchFix已經(jīng)擁有查找和修復(fù)我之前提到的所有示例的規(guī)則。它在Meta內(nèi)部和開源項(xiàng)目中已經(jīng)被使用來查找問題并更新代碼。
Beta version stage, already useful - Rules for all the mentioned examples problems and more - Was used to find issues and update code of multiple projects both internally at Meta and in open source - Running in CI of several projects on GitHub
并且我們已經(jīng)在幾個(gè)GitHub上的元開源項(xiàng)目的CI中運(yùn)行了它。將來我們希望為更多類別的問題添加更多的規(guī)則。而這項(xiàng)工作將根據(jù)我們?cè)谡鎸?shí)代碼庫中發(fā)現(xiàn)的實(shí)際問題進(jìn)行引導(dǎo)。此外,我們還希望增加更多的配置選項(xiàng)。
目前TorchFix假設(shè)您使用最新版本的PyTorch,但實(shí)際上這未必是正確的。我們還希望將其與PyTorch CI和PyTorch文檔生成集成。因此,例如,當(dāng)您在PyTorch中棄用一個(gè)函數(shù)時(shí),我們希望能夠檢查是否存在TorchFix的規(guī)則,以標(biāo)記并更新棄用的函數(shù)...當(dāng)然,我們還希望看到TorchFix在更多項(xiàng)目的CI中使用。希望這是有機(jī)地發(fā)生的,當(dāng)人們嘗試TorchFix并發(fā)現(xiàn)它很有用時(shí)。以及如何參與進(jìn)來。首先,只需嘗試在您的代碼庫上運(yùn)行它。如果它發(fā)現(xiàn)任何問題,或者您可以發(fā)現(xiàn)TorchFix本身出現(xiàn)了一些問題。可以在github反饋。
https://github.com/pytorch/test-infra/tree/main/tools/torchfix - Bug reports, feature requests, and code contributions are very welcome - There are open "good first issues" -searchfor[TorchFix]
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4256瀏覽量
62223 -
代碼
+關(guān)注
關(guān)注
30文章
4694瀏覽量
68075 -
pytorch
+關(guān)注
關(guān)注
2文章
795瀏覽量
13076
原文標(biāo)題:《PytorchConference2023 翻譯系列》3- TorchFix
文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論