使用ResNet50預(yù)置算法訓(xùn)練美食分類模型-優(yōu)化建議
1112
2025-04-01
偶遇OBS"驚天"大Bug
↑開局一張圖,故事全靠編。
緣起
做開發(fā)的尤其是前端,你永遠(yuǎn)不知道用戶會怎么使用你的產(chǎn)品,比如頁面上一個輸入框,你永遠(yuǎn)不知道用戶會輸入什么。這次能遇到OBS的這個Bug,也是我無意間做了不當(dāng)?shù)摹拜斎搿?,?dǎo)致上傳到OBS的文件無法正常顯示,也無法正常操作(如:刪除)。先來看看問題究竟是啥,請看下圖:1. 無法顯示正常的文件信息;2. 點擊刪除無法正常刪除文件,是怎么刪都不能刪的!; 3. 其他操作也不正常,如分享復(fù)制出來的鏈接訪問是NoSuchKeyThe specified key does not exist等等。導(dǎo)致問題出現(xiàn)的原因,大概就是工單解決方案中提到的:上傳的對象帶了特殊字符,OBS 服務(wù)后臺不能正常的轉(zhuǎn)義。
復(fù)現(xiàn)
我究竟是做了什么操作才導(dǎo)致OBS無法正常轉(zhuǎn)義呢?為了復(fù)現(xiàn)這個問題,我找到了上一次實踐的錯誤代碼,罪魁禍?zhǔn)拙褪撬耍?/p>
cd?~cd?workmkdir?mytestcd?mytestwget?http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gztar?-zxvf?./train-images-idx3-ubyte.gz
通過一波Terminal操作,我下載了一個train-images-idx3-ubyte.gz文件,并錯誤地執(zhí)行了tar -zxvf ./train-images-idx3-ubyte.gz,這里其實已經(jīng)是“罪惡的源頭”了,我們通過執(zhí)行l(wèi)s,可以看到如下文件:
sh-$ls'<'????????''$'4'??''$'446'??''$'65'??''$'3725557''9'???train-images-idx3-ubyte.gz''$'5'??''$'1'??''$'456'??''$'\f'????????'m'$'\v
sh-$ls'<'????????''$'\224'??''$'\374\374\356'??''$'\376\035'??''$'\313\367\372\375\375\375\257''9'???train-images-idx3-ubyte.gz''$'\315'??''$'\341'??''$'\374\375\216'??''$'\f'????????'m'$'\v\002'
2'其實這里已經(jīng)是問題的所在了,因為解壓不當(dāng)導(dǎo)致了一些特殊字符的文件名的生成,當(dāng)然,如果不上傳這些文件到OBS,是不會偶遇文章開頭的問題。為了復(fù)現(xiàn),我們通過Moxing將文件上傳到OBS上,代碼如下:
import?os? import?moxing?as?mox?? mox.file.copy_parallel('./mytest',?'obs://mindspore-labs/mytest')print('Upload?done!')
上傳之后,回到OBS,發(fā)現(xiàn)我們剛解壓出來的文件已經(jīng)存在, 而且如“幽靈”一般存在,它們沒有名字,無法刪除,就算分享出來也無法正常訪問,這里姑且稱它們?yōu)椤坝白游募薄?/p>
求解
遇到這樣的Bug,我還是很興奮的,作為Copy攻城獅,我平時很少獨立思考,這次卻破天荒地費(fèi)了的腦力想想了--還是提工單吧!本來提了工單可能就萬事無憂了,不過對于未知事物的好奇,我也開始一步步探索。
網(wǎng)頁操作
首先,從結(jié)果來論證,直接面向用戶的前端頁面最能直接展現(xiàn)問題。我分別查看了正常情況和“影子文件”的network,發(fā)現(xiàn)了有意思額情況,正常的返回在XML中Contents下包含key、size等返回信息,也就是我們能看到的文件名、文件大小、修改時間之類的,而“影子文件”返回的數(shù)據(jù)Contents下沒有任何信息,所以我們看不到文件相關(guān)的信息,也無法正常操作文件。
通Moxing列舉
其次,通過Moxing列舉正常能讀取的文件和“影子文件”,也發(fā)現(xiàn)了些貓膩,正常文件列表是可以被讀取到的,而嘗試讀取“影子文件”目錄就會報錯。
執(zhí)行代碼:
import?moxing?as?mox?? #?列舉正常文件mox.file.list_directory('obs://mindspore-labs/experiment_1/MNIST/',?recursive=True)#?列舉影子文件mox.file.list_directory('obs://mindspore-labs/mytest/',?recursive=True)
通過以上兩步嘗試,也預(yù)示我們無法通過OBS網(wǎng)頁端和Moxing來刪除“影子文件”,根據(jù)大佬給出的指導(dǎo),應(yīng)該使用obsutil[3]或者SDK[4]去刪除文件對象。值得注意的是,這兩種方法都需要獲取訪問密鑰即AK/SK(Access Key ID/Secret Access Key),獲取AK/SK的細(xì)節(jié)這里就不贅述了。
obsutil體驗
不得不提下這款用于訪問管理OBS的命令行工具,它具有四大優(yōu)勢:
簡單、易用;
無需安裝,輕便小巧,即下即用;
同時支持Windows/Linux/macOS三大平臺;
配置多元化,性能卓越。
我是windows系統(tǒng),下載之后運(yùn)行obsutil.exe,執(zhí)行config -i=ak -k=sk -e=endpoint進(jìn)行初始化配置,ak就是訪問密鑰的AK,sk是訪問密鑰的SK,endpoint對應(yīng)桶所在的終端節(jié)點如:obs.cn-north-4.myhuaweicloud.com就是華北-北京4,endpoint可訪問地區(qū)和終端節(jié)點[5]查看。
我嘗試列出“影子文件”,結(jié)果還是拋了異常Error: Status [0], error code [], error message [XML syntax error on line 1: illegal character code U+000C], request id [000001735BD0E90D440F97BC745F201C],如果要知道究竟發(fā)生了什么,可以工單并向華為云工程師大佬提供這個request id,其實通過報錯信息我們也能察覺到是有非法字符導(dǎo)致的。
然后我滿懷信心的敲下了rm obs://mindspore-labs/mytest -r -f,以為這樣就能刪除掉,結(jié)果:
[________________________________________________________]??%?tps:0.00?0/0?52ms Warn:?No?task?to?run List?objects?in?the?bucket?[mindspore-labs]?to?delete?failed,?status?[0],?error?code?[],?error?message?[XML?syntax?error?on?line?1:?illegal?character?code?U+000C],?request?id?[000001735BD70EBE44149CE8B9E179C9]
是的,刪除失敗!!!去網(wǎng)頁端查看,文件依舊如磐石般巋然不動!
OBS SDK體驗
既然前面三種方法都沒能刪除頑固的“影子文件”,那試試僅有的一絲希望--OBS SDK。由于我是JavaScript技術(shù)棧,盡管工單那頭的大佬極力推薦Java SDK,我還是毅然決然地選擇了Node.js SDK。趕緊下載官方文檔提供的Demo代碼[6],開始我認(rèn)為的最后一根破除稻草:
安裝依賴:
npm?install?esdk-obs-nodejs
找到examples\delete-objects-sample.js開干,替換access_key_id的值為訪問密鑰的AK,secret_access_key的值為訪問密鑰的SK,server的值為桶所在的終端節(jié)點如:"https://obs.cn-north-4.myhuaweicloud.com";其實和**obsutil**的配置大同小異.
我們先通過listObjects列舉一下“影子文件”:
var?obs?=?new?ObsClient({ ????access_key_id:?'您的訪問訪問AK', ????secret_access_key:?'您的訪問密鑰CK', ????server?:?'桶所在的終端節(jié)點'});var?bucketName?=?'mindspore-labs';?//?桶名obs.listObjects({ ????Bucket:?bucketName, ????Prefix:?'mytest/'?//?前綴,列舉mytest下文件}).then((result)?=>?{ ????if(result.CommonMsg.Status?300){ ????????console.log('List?all?objects?in?folder?mytest/?\n'); ????????for(let?j=0;j
得到的結(jié)果出乎我的意料,不僅是影子文件,其他正常的文件也能正常列出,這足以說明Copy攻城獅功力到位了,也是能夠解決問題的:
$?node?examples/delete-objects-sample.js List?all?objects?in?folder?src0/ ????????Key-->mytest/ ????????ETag-->"d41d8cd98f00b204e9800998ecf8427e" ????????Key-->mytest/ ????????ETag-->"d41d8 ????????ETag-->"d41d8cd98f00b204e9800998ecf8427e" ????????Key-->mytest/< ????????ETag-->"d41d8cd98f00b204e9800998ecf8427e" ????????Key-->mytest/md98f00b204e9800998ecf8427e" ????????Key-->mytest/t ????????ETag-->"d41d8cd98f00b204e9800998ecf8427e" ????????Key-->mytest/train-images-idx3-ubyte.gz
影子文件神秘的面紗已經(jīng)揭開,因為OBS后臺無法解析特殊符號如小于號,導(dǎo)致解析進(jìn)程中斷了,亦或是文件路徑名不能有特殊字符。既然問題到這,已經(jīng)非常透徹了,接下來應(yīng)該是破局的時候了。
破局
既然最終找到了問題的根本,嘗試解決吧,依舊使用我們的SDK來處理,只需在上面列舉中調(diào)用deleteObject:
obs.listObjects({ ????Bucket:?bucketName, ????Prefix:?'mytest/'}).then((result)?=>?{ ????if(result.CommonMsg.Status?300){ ????????console.log('List?all?objects?in?folder?mytest/?\n'); ????????for(let?j=0;j
盡管這是最愚笨的方式,但我已經(jīng)達(dá)到了我的預(yù)期,無法刪除的“影子文件”終于可以通通刪除了,感覺世界終于清靜了!
溫馨提示:以上方法會清除目錄下的所有文件,如有要保留特定的文件請通過編寫代碼實現(xiàn)
最后在OBS網(wǎng)頁端再確認(rèn)一下,終于完成了!
加入組織
MDG 是 ModelArts Developer Groups 的縮寫。是由 ModelArts 開發(fā)者發(fā)起的開放、創(chuàng)新、多元的開發(fā)者社區(qū)組織。致力于幫助開發(fā)者學(xué)習(xí)提升、互動交流、挖掘機(jī)會,推動 AI、互聯(lián)網(wǎng)等產(chǎn)業(yè)生態(tài)的建立和發(fā)展。MDG 是面向人工智能、AI 技術(shù)、開源項目及 ModelArts 平臺技術(shù)感興趣的公益性開發(fā)者社區(qū),相關(guān)開發(fā)者、軟件工程師、創(chuàng)業(yè)者、運(yùn)營人、產(chǎn)品人、大學(xué)生、老師等都可以參加到 MDG 社區(qū)。
MDG 秉承開放、創(chuàng)新、多元的社區(qū)文化,完全由各地志愿者自發(fā)組織和建立。目前,我們已在北京、上海、杭州、重慶建立了社區(qū)組織。自 2019 年12月起陸續(xù)開展了多次線上、線下活動。許多小伙伴正是參與了華為云 ModelArts 的相關(guān)活動后,申請加入MDG志愿者組織,從而更深入地了解ModelArts平臺。
新晉華為云云享專家Copy攻城獅,我是胡琦,近期有幸參與【2020華為云AI實戰(zhàn)營】,學(xué)習(xí)ModelArts并加入【MDG社區(qū)】,期待在這里與你相遇!
參考鏈接
[1]?https://bbs.huaweicloud.com/forum/thread-65345-1-1.html
[2]?http://2020.huaweicloud.ai
[3]?https://support.huaweicloud.com/utiltg-obs/obs_11_0001.html
[4]?https://support.huaweicloud.com/sdkreference-obs/obs_02_0001.html
[5]?https://developer.huaweicloud.com/endpoint?OBS
[6]?https://obssdk.obs.cn-north-1.myhuaweicloud.com/current/nodejs/nodejs.zip
OBS ModelArts
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。