面試官常考的MySQL索引(MySQL進階)
797
2025-04-02
任務
1、原始wenet代碼
2、修改nbpe=500;跑一下,對比結果
3、僅用encoder+ctcloss去掉decoder的attention模塊和對應的loss,對比結果
修改:配置文件中的ctc_weight(wenet/transformer/asrmodel.py的98行)
4、focal loss(修改了transformer文件夾下的label_smoothing_loss和asr_model文件)
5、去掉ctc模塊,對比效果
6、聽音頻,標TP
7、找工具,將m4a轉(解碼)為pcm
8、focal loss調參
9、訓練dice loss(已經訓練起來了)
10、8月18號標數據。提交:他們標的(名字_日期_predict.txt),我標的(名字_日期_label.txt)。
11、看論文
12、下載數據集voxpopuli
下載好的數據放在了:/asr/common/16k-data/train/open-source/voxpopuli/
“10k”和“asr”已下載完畢。
注:Torchaudio自帶的download_ulr函數會報網絡錯誤,不能下載。需要使用命令“wget -”下載。
13、focal loss sigmoid and label smooth
14、訓練1w小時的數據集(已經訓練起來了)
數據路徑:/asr/common/16k-data/train/open-source/GigaSpeech/GigaSpeechData
注意:stage0中原本的stage1通過:python3 local/extract_meta.py /asr/common/16k-data/train/open-source/GigaSpeech/GigaSpeechData/GigaSpeech.json data/gigaspeech_corpus/? 來運行
LOSS出現nan:8-22 12:48:41 WARNING NaN or Inf found in input tensor. 第14個epoch中期,損失上升
15、wenet代碼,流式解碼
雜
? Pycharm遠程服務器訪問
填寫ip、用戶名、密碼,設置根目錄
設置目錄映射
配置python解釋器
? 本地訪問服務器端的tensorboard
tensorboard --logdir=wangyao --port=6005
ssh -L 16005:127.0.0.1:6005 ubuntu@192.168.98.174
http://127.0.0.1:16005
? 批量刪除GPU上的進程
nvidia-smi |grep python | grep 11 | awk '{print }' | xargs kill -9
?? 解決Window運行docker容器無法進行端口映射的問題
https://blog.csdn.net/weixin_37760377/article/details/89913124
? tmux
tmux new -s wy1
tmux ls
tmux a -t wy1
ctrl+b d
ctrl+b pageUp/pageDown
ctrl+b % 豎直拆分屏幕(兩個 Shell 分別位于左右)
ctrl+b " 水平拆分屏幕(兩個 Shell 分別位于上下)
ctrl+b o 切換到另一個 Shell
ctrl+b z:當前窗格全屏顯示,再使用一次會變回原來大小。
ctrl+b x:關閉一個終端
tmux kill-session -t
?? torch.nn.embedding
可以理解為查表,鍵是onehot對應的索引,值是對應的我們embedding。
默認隨機賦值(均值為0,標準差為1的正態分布)。可以被訓練(權重是由torch.tensor創建的,并且用Parameter封裝),也可以手動加載權重。
?? Python并發編程
l? 基本概念
程序員無法把所有的硬件操作細節都了解到,管理這些硬件并且加以優化使用是非常繁瑣的工作,這個繁瑣的工作就是操作系統來干的,有了他,程序員就從這些繁瑣的工作中解脫了出來,只需要考慮自己的應用軟件的編寫就可以了,應用軟件直接使用操作系統提供的功能來間接使用硬件。
作用:
1、隱藏了丑陋的硬件調用接口,為應用程序員提供調用硬件資源的更好,更簡單,更清晰的模型(系統調用接口)。應用程序員有了這些接口后,就不用再考慮操作硬件的細節,專心開發自己的應用程序即可。
例如:操作系統提供了文件這個抽象概念,對文件的操作就是對磁盤的操作,有了文件我們無需再去考慮關于磁盤的讀寫控制(比如控制磁盤轉動,移動磁頭讀寫數據等細節),
2、將應用程序對硬件資源的競態請求變得有序化
例如:很多應用軟件其實是共享一套計算機硬件,比方說有可能有三個應用程序同時需要申請打印機來輸出內容,那么a程序競爭到了打印機資源就打印,然后可能是b競爭到打印機資源,也可能是c,這就導致了無序,打印機可能打印一段a的內容然后又去打印c...,操作系統的一個功能就是將這種無序變得有序。
現代計算機或者網絡都是多用戶的,多個用戶不僅共享硬件,而且共享文件,數據庫等信息,共享意味著沖突和無序。
具體:
1.記錄哪個程序使用什么資源
2.對資源請求進行分配
3.為不同的程序和用戶調解互相沖突的資源請求。
我們可將上述操作系統的功能總結為:處理來自多個程序發起的多個(多個即多路)共享(共享即復用)資源的請求,簡稱多路復用。多路復用有兩種實現方式:
1.時間上的復用
當一個資源在時間上復用時,不同的程序或用戶輪流使用它,第一個程序獲取該資源使用結束后,在輪到第二個。。。第三個。。。
例如:只有一個cpu,多個程序需要在該cpu上運行,操作系統先把cpu分給第一個程序,在這個程序運行的足夠長的時間(時間長短由操作系統的算法說了算)或者遇到了I/O阻塞,操作系統則把cpu分配給下一個程序,以此類推,直到第一個程序重新被分配到了cpu然后再次運行,由于cpu的切換速度很快,給用戶的感覺就是這些程序是同時運行的,或者說是并發的,或者說是偽并行的。至于資源如何實現時間復用,或者說誰應該是下一個要運行的程序,以及一個任務需要運行多長時間,這些都是操作系統的工作。
2.空間上的復用
每個客戶都獲取了一個大的資源中的一小部分資源,從而減少了排隊等待資源的時間。
例如:多個運行的程序同時進入內存,硬件層面提供保護機制來確保各自的內存是分割開的,且由操作系統控制,這比一個程序獨占內存一個一個排隊進入內存效率要高的多。
有關空間復用的其他資源還有磁盤,在許多系統中,一個磁盤同時為許多用戶保存文件。分配磁盤空間并且記錄誰正在使用哪個磁盤塊是操作系統資源管理的典型任務。
這兩種方式合起來便是多道技術
并發與并行:
進程是操作系統分配資源的最小單元, 線程是操作系統調度的最小單元。
一個應用程序至少包括1個進程,而1個進程包括1個或多個線程,線程的尺度更小。
每個進程在執行過程中擁有獨立的內存單元,而一個線程的多個線程在執行過程中共享內存。
舉例:
計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在運行。
假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背后的含義就是,單個CPU一次只能運行一個任務。編者注: 多核的CPU就像有了多個發電廠,使多工廠(多進程)實現可能。
進程就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態。
一個車間里,可以有很多工人。他們協同完成一個任務。
線程就好比車間里的工人。一個進程可以包括多個線程。
車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象征一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。
可是,每間房間的大小不同,有些房間最多只能容納一個人,比如廁所。里面有人的時候,其他人就不能進去了。這代表一個線程使用某些共享內存時,其他線程必須等它結束,才能使用這一塊內存。
一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,后到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區域。
還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大于n,多出來的人只能在外面等著。這好比某些內存區域,只能供給固定數目的線程使用。
這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。后到的人發現鑰匙架空了,就知道必須在門口排隊等著了。這種做法叫做"信號量"(Semaphore),用來保證多個線程不會互相沖突。
不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用后者替代前者。但是,因為mutex較為簡單,且效率高,所以在必須保證資源獨占的情況下,還是采用這種設計。
l? Python中的多進程
python的多進程編程主要依靠multiprocess模塊。我們利用multiprocess模塊的Process方法創建了兩個新的進程p1和p2來進行并行計算。Process方法接收兩個參數, 第一個是target,一般指向函數名,第二個時args,需要向函數傳遞的參數。對于創建的新進程,調用start()方法即可讓其開始。
盡管只創建了兩個進程,可實際運行中卻包含里1個母進程和2個子進程。之所以使用join()方法就是為了讓母進程阻塞,等待子進程都完成后才打印出總共耗時,否則輸出時間只是母進程執行的時間。
新創建的進程與進程的切換都是要耗資源的,所以平時工作中進程數不能開太大。
同時可以運行的進程數一般受制于CPU的核數。
除了使用Process方法,我們還可以使用Pool類創建多進程。
Pool類可以提供指定數量的進程供用戶調用,當有新的請求提交到Pool中時,如果進程池還沒有滿,就會創建一個新的進程來執行請求。如果池滿,請求就會告知先等待,直到池中有進程結束,才會創建新的進程來執行這些請求。
對Pool對象調用join()方法會等待所有子進程執行完畢,調用join()之前必須先調用close()或terminate()方法,讓其不再接受新的Process了。
多進程也支持繼承式調用,重寫run方法
通常,進程之間是相互獨立的,每個進程都有獨立的內存。通過共享內存(nmap模塊),進程之間可以共享對象,使多個進程可以訪問同一個變量(地址相同,變量名可能不同)。多進程共享資源必然會導致進程間相互競爭,所以應該盡最大可能防止使用共享狀態。還有一種方式就是使用隊列queue來實現不同進程間的通信或數據共享,這一點和多線程編程類似。
l? Python中的多線程
python中的多進程編程主要依靠threading模塊。創建新線程與創建新進程的方法非常類似。threading.Thread方法可以接收兩個參數, 第一個是target,一般指向函數名,第二個時args,需要向函數傳遞的參數。對于創建的新線程,調用start()方法即可讓其開始。我們還可以使用current_thread().name打印出當前線程的名字。如果要實現主線程和子線程的同步,我們必需使用join方法
當我們設置多線程時,主線程會創建多個子線程,在python中,默認情況下主線程和子線程獨立運行互不干涉。如果希望讓主線程等待子線程實現線程的同步(在子線程完成運行之前,這個子線程的父線程將一直被阻塞),我們需要使用join()方法。如果我們希望一個主線程結束時不再執行子線程,我們應該怎么辦呢? 我們可以使用t.setDaemon(True)。t.setDaemon(True)將線程聲明為守護線程,必須在start()方法調用之前設置,如果不設置為守護線程程序會被無限掛起。這個方法基本和join是相反的。當我們在程序運行中,執行一個主線程,如果主線程又創建一個子線程,主線程和子線程就分兵兩路,分別運行,那么當主線程完成想退出時,會檢驗子線程是否完成。如果子線程未完成,則主線程會等待子線程完成后再退出。但是有時候我們需要的是只要主線程完成了,不管子線程是否完成,都要和主線程一起退出,這時就可以用setDaemon方法啦。
除了使用Thread()方法創建新的線程外,我們還可以通過繼承Thread類重寫run方法創建新的線程,這種方法更靈活
一個進程所含的不同線程間共享內存,這就意味著任何一個變量都可以被任何一個線程修改,因此線程之間共享數據最大的危險在于多個線程同時改一個變量,把內容給改亂了。如果不同線程間有共享的變量,其中一個方法就是在修改前給其上一把鎖lock,確保一次只有一個線程能修改它。threading.lock()方法可以輕易實現對一個共享變量的鎖定,修改完后release供其它線程使用。比如下例中賬戶余額balance是一個共享變量,使用lock可以使其不被改亂。
Python雖然支持多線程應用程序的創建,但是Python解釋器使用了內部的全局解釋器鎖定(Global Interpreter Lock,GIL),在任意指定的時刻只允許單個線程執行,意思就是每個CPU在同一時間只能執行一個線程。在單核CPU下的多線程其實都只是并發,不是并行,并發和并行從宏觀上來講都是同時處理多路請求的概念。但并發和并行又有區別,并行是指兩個或者多個事件在同一時刻發生;而并發是指兩個或多個事件在同一時間間隔內發生。
那么是不是python的多線程就完全沒用了呢?
分類討論:
CPU密集型代碼(各種循環處理、計數等等),在這種情況下,由于計算工作多,ticks計數很快就會達到閾值,然后觸發GIL的釋放與再競爭(多個線程來回切換當然是需要消耗資源的),所以python下的多線程對CPU密集型代碼并不友好.
IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。所以python的多線程對IO密集型代碼比較友好。
對CPU密集型代碼(比如循環計算) - 多進程效率更高
對IO密集型代碼(比如文件操作,網絡爬蟲) - 多線程效率更高。
對于IO密集型操作,大部分消耗時間其實是等待時間,在等待時間中CPU是不需要工作的,那你在此期間提供雙CPU資源也是利用不上的,相反對于CPU密集型代碼,2個CPU干活肯定比一個CPU快很多。那么為什么多線程會對IO密集型代碼有用呢?這時因為python碰到等待會釋放GIL供新的線程使用,最終結果是某個線程等待IO的時候其他線程可以繼續執行。
Python 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。