Python 發(fā)布 3.13 版本,人工智能與機器學習的潛在顛覆者!
Python 3.13 版本近期發(fā)布,其中包含了多項重大更新。作為機器學習、數(shù)據(jù)科學和人工智能領域應用最廣泛的編程語言,Python 一直在不斷發(fā)展以滿足這些領域日益增長的需求。最新版本 Python 3.13 提供了多項旨在提升性能和效率的改進,對于從事機器學習和人工智能項目的開發(fā)者來說,這是一個重要的里程碑。
Python 在機器學習和人工智能領域的優(yōu)勢主要在于其簡潔性、豐富的庫支持以及龐大的社區(qū)。然而,隨著人工智能領域的不斷擴展,對更高性能和效率的 Python 代碼的需求變得至關重要。Python 3.13 引入了自由線程和即時編譯 (JIT) 等實驗性功能,可以顯著提升計算密集型工作負載的性能,而這些工作負載在機器學習訓練和推理任務中非常常見。
1. 實驗性自由線程 CPython (PEP 703)
長期以來,全局解釋器鎖 (GIL) 一直是 Python 的一個限制因素,尤其是在需要多線程的任務中。GIL 會阻止多個原生線程同時執(zhí)行 Python 字節(jié)碼,這可能會成為機器學習模型訓練等 CPU 密集型操作的瓶頸。盡管 Python 支持多線程,但 GIL 確保在任何給定時間只有一個線程在解釋器中運行,這使得充分利用多核處理器變得困難。
對于涉及大型數(shù)據(jù)集和 CPU 密集型計算的機器學習工作負載來說,GIL 會嚴重限制性能。開發(fā)者通常不得不依賴多進程等變通方法,但這會增加復雜性和開銷。
自由線程執(zhí)行簡介
Python 3.13 引入了對自由線程執(zhí)行的實驗性支持,允許 Python 在沒有 GIL 的情況下運行。這是該語言執(zhí)行模型的重大變化。移除 GIL 意味著 Python 現(xiàn)在可以支持真正的多線程,允許多個線程在不同的內核上同時運行。
這為更快地執(zhí)行多線程應用程序打開了大門,而無需切換到外部庫或多進程框架。
對機器學習工作負載的好處
- 并行數(shù)據(jù)處理:在沒有 GIL 限制的情況下并行運行 CPU 密集型任務的能力意味著數(shù)據(jù)預處理、特征提取和模型評估等 CPU 密集型操作現(xiàn)在可以以真正的并行模式運行,從而顯著加快工作流程。
- 提升性能:對于訓練機器學習模型,尤其是在處理大型數(shù)據(jù)集或復雜算法時,自由線程可以顯著縮短完成訓練周期所需的時間。
- 減少對多進程的需求:在早期的 Python 版本中,開發(fā)者不得不求助于多進程來繞過 GIL。這通常會導致更高的內存消耗和開銷。借助新的自由線程模式,可以緩解這些挑戰(zhàn),從而使代碼更簡潔、更高效。
如何啟用自由線程
在 Python 3.13 中啟用自由線程需要使用特殊版本的解釋器:
- 自由線程構建:要利用此功能,請使用專為自由線程設計的構建,例如python3.13t? 或python3.13t.exe。
- 從源代碼構建:您還可以使用--disable-gil 選項編譯 Python,以手動構建自由線程版本。
- 檢查支持:要確認解釋器中是否已禁用 GIL,請運行python -VV? 或檢查sys._is_gil_enabled() 的輸出。
注意事項和限制
雖然自由線程的概念很有前景,但它仍處于實驗階段。在生產環(huán)境中使用它之前,需要牢記以下幾點:
- 潛在的錯誤:由于它是一個實驗性功能,因此可能會出現(xiàn)無法預見的錯誤或問題,從而影響穩(wěn)定性。
- 單線程應用程序的性能:如果沒有 GIL,單線程性能可能會因管理多個線程的額外開銷而受到影響。
- 重新構建 C 擴展模塊:對于依賴 GIL 的 C 擴展模塊,您需要重新構建它們以確保與自由線程版本的 Python 兼容。
2. 引入 JIT 編譯器 (PEP 744)
JIT 編譯器是一種通過在執(zhí)行期間將部分代碼編譯成機器語言來提高程序性能的系統(tǒng),而不是在執(zhí)行之前進行編譯。這使得代碼能夠更快地運行,因為可以根據(jù)程序在實際使用中的情況進行某些優(yōu)化。
與傳統(tǒng)解釋器的區(qū)別
- 傳統(tǒng)解釋器:在典型的 Python 執(zhí)行中,代碼在運行時逐行解釋。雖然這很靈活且易于調試,但對于計算密集型任務(例如機器學習和人工智能中經(jīng)常遇到的任務)來說,速度可能會很慢。
- JIT 編譯:JIT 編譯器不會解釋每一行代碼,而是識別出代碼中反復使用的“熱點”部分,并將它們編譯成機器代碼。這可以加快執(zhí)行速度,因為機器代碼可以直接在 CPU 上運行,而無需解釋的開銷。
Python 3.13 引入了實驗性的 JIT 編譯器,作為 PEP 744 的一部分,旨在加快 Python 程序的執(zhí)行速度。雖然此功能仍處于早期階段,但它標志著在提高 Python 處理繁重計算任務(包括機器學習和人工智能中常見的任務)的性能方面邁出了重要一步。
內部架構和優(yōu)化階段
Python 3.13 中的 JIT 編譯器通過將 Python 代碼中頻繁執(zhí)行的部分轉換為優(yōu)化的機器代碼來工作。以下是它的工作原理:
- 第一層字節(jié)碼:Python 代碼首先像往常一樣轉換為字節(jié)碼。
- 熱點代碼檢測:JIT 識別出代碼中經(jīng)常運行的部分(“熱點代碼”)。
- **中間表示 (IR)**:熱點代碼被轉換為一種稱為第二層中間表示 (IR) 的內部格式,這種格式更容易優(yōu)化。
- 優(yōu)化:IR 經(jīng)過各種優(yōu)化過程以提高性能。
- 機器代碼生成:最后,優(yōu)化的 IR 被轉換為機器代碼,其運行速度比原始 Python 字節(jié)碼快得多。
這種方法允許 Python 有選擇地只編譯代碼中最常用的部分,從而在無需手動干預的情況下提高性能。
對機器學習和人工智能開發(fā)的影響
- 性能提升:對于機器學習和人工智能工作負載(其中大型數(shù)據(jù)集和復雜計算很常見),Python 的 JIT 編譯器可以帶來顯著的好處:
更快地執(zhí)行 Python 代碼:通過優(yōu)化代碼中的熱點,JIT 編譯器可以減少訓練循環(huán)、數(shù)據(jù)處理和實時推理任務所花費的時間。
減少開銷:由于 JIT 編譯器根據(jù)使用情況有選擇地編譯代碼,因此它減少了對持續(xù)解釋的需求,從而使 Python 在應用程序的關鍵部分的表現(xiàn)更像一種編譯語言。
- 對訓練循環(huán)和實時推理的好處:
- 訓練循環(huán):在訓練機器學習模型時,循環(huán)通常需要處理大量數(shù)據(jù)并執(zhí)行重復計算。JIT 編譯器可以優(yōu)化這些循環(huán),從而縮短訓練時間。
- 實時推理:對于需要實時預測的應用程序(例如人工智能驅動的服務),JIT 編譯器可以通過加快推理過程來減少延遲。
未來優(yōu)化
盡管 Python 3.13 中 JIT 編譯器的初始收益并不大,但開發(fā)者可以預期在未來的版本中會有持續(xù)的改進。隨著 JIT 變得更加健壯和智能,它將能夠處理更復雜的優(yōu)化,從而帶來更大的性能提升。
如何使用 JIT 編譯器
要在 Python 3.13 中啟用 JIT 編譯器,您需要使用實驗性 JIT 選項構建 Python:
- 構建 Python:從源代碼構建 Python 時,請使用--enable-experimental-jit 選項。
- 運行時激活:您可以使用PYTHON_JIT? 環(huán)境變量在運行時控制 JIT 編譯器的激活。要啟用 JIT,請設置PYTHON_JIT=1?。您可以通過設置PYTHON_JIT=0 來禁用它。
關于實驗狀態(tài)的說明
JIT 編譯器在 Python 3.13 中仍處于實驗階段。默認情況下它是禁用的,開發(fā)者應該謹慎使用它,尤其是在生產環(huán)境中。隨著 JIT 的發(fā)展,它可能會在未來的 Python 版本中成為一個更穩(wěn)定、更高效的工具。
3. 增強的類型提示功能
Python 3.13 還對其類型系統(tǒng)進行了一些改進,使開發(fā)者能夠更輕松地編寫清晰、易于維護和類型安全的代碼。這些更新在大型機器學習項目中特別有用,在這些項目中,數(shù)據(jù)類型的清晰度有助于避免運行時錯誤。
3.1 帶有默認值的類型參數(shù) (PEP 696)
TypeVar、ParamSpec 和 TypeVarTuple 默認值簡介
Python 的 TypeVar、ParamSpec? 和 TypeVarTuple 泛型現(xiàn)在支持默認值。這意味著在定義泛型類或函數(shù)時,您現(xiàn)在可以指定默認類型參數(shù),如果未提供特定類型,則將使用這些默認類型參數(shù)。
對機器學習代碼庫的好處
- 簡化泛型類和函數(shù)的定義:在機器學習中,通常使用泛型類來處理數(shù)據(jù)結構、模型或配置。使用默認類型參數(shù),您可以減少樣板代碼,使代碼庫更簡潔。
- 增強代碼可讀性和可維護性:定義默認類型的能力可以使代碼更簡潔易懂,這在大型項目中更容易維護。
3.2 棄用裝飾器 (PEP 702)
warnings.deprecated() 裝飾器說明
Python 3.13 引入了 warnings.deprecated() 裝飾器,允許開發(fā)者將函數(shù)標記為已棄用。此警告在運行時和類型系統(tǒng)中都會引發(fā),從而使開發(fā)者清楚地知道不再建議使用某個函數(shù)。
好處
- 標記已棄用的函數(shù):此功能允許機器學習工程師清楚地標記已過時或將在未來版本中刪除的函數(shù)。
- 協(xié)助代碼重構:在處理長期機器學習項目時,有效地管理棄用至關重要。此裝飾器簡化了識別已棄用功能并隨著時間的推移對其進行重構的過程。
3.3 只讀 TypedDict 項 (PEP 705)
typing.ReadOnly 簡介
Python 現(xiàn)在允許您將 TypedDict 中的某些項指定為只讀。這是使用新的 typing.ReadOnly 功能完成的,該功能可以防止在設置特定字段后對其進行修改。
好處
- 防止意外修改:在機器學習項目中,配置和模型參數(shù)通常存儲在字典中。通過將字段標記為只讀,您可以確保在運行時不會意外更改關鍵參數(shù)。
- 確保數(shù)據(jù)完整性:此功能有助于維護數(shù)據(jù)結構的完整性,尤其是在復雜的機器學習管道中。
3.4 使用 typing.TypeIs 進行類型縮小 (PEP 742)
typing.TypeIs 用于類型縮小的說明
新的 typing.TypeIs? 功能提供了比現(xiàn)有的 typing.TypeGuard 更直觀的類型縮小行為。它允許類型檢查器根據(jù)條件細化變量的類型,從而實現(xiàn)更精確的類型推斷。
好處
- 提供更直觀、更精確的類型檢查:此功能通過確保在執(zhí)行期間正確縮小類型范圍來幫助開發(fā)者編寫更安全的代碼。
- 減少運行時錯誤:通過在開發(fā)早期捕獲類型錯誤,此功能可以顯著降低運行時問題的可能性,這在數(shù)據(jù)密集型機器學習項目中特別有用。
4. 使用“asyncio”改進并發(fā)性
在人工智能和機器學習中,高效地管理異步任務至關重要,尤其是在需要實時數(shù)據(jù)處理、模型推理或與多個 API 交互的環(huán)境中。Python 3.13 對 asyncio 模塊進行了一些重要更新,改進了其在這些苛刻場景中處理并發(fā)性和任務管理的能力。
Python 3.13 的一項重大改進是增強了 asyncio.TaskGroup。任務組允許多個異步任務一起管理,從而更容易處理它們的整個生命周期,尤其是在處理取消或錯誤時。
好處
- 可靠的任務取消和錯誤處理:在以前版本的 Python 中,在復雜的機器學習管道中,任務取消和錯誤管理更難穩(wěn)健地處理。借助改進的TaskGroup,開發(fā)者現(xiàn)在可以更輕松地管理這些流程,確保任何故障或取消都能得到妥善處理。這對于涉及大型數(shù)據(jù)集、流數(shù)據(jù)或同時使用多個數(shù)據(jù)源的機器學習任務特別有用。
- 對于管理異步操作至關重要:許多機器學習和人工智能應用程序依賴于異步操作,例如實時流式傳輸數(shù)據(jù)或同時處理多個請求。增強的TaskGroup 確保此類任務能夠高效完成,并更有效地管理任何潛在問題,從而降低管道停滯或瓶頸的風險。
用于服務器管理的新方法
Python 3.13 為 asyncio? 框架引入了兩種用于管理服務器連接的新方法:Server.close_clients()? 和 Server.abort_clients()。這些新方法使開發(fā)者能夠更好地控制其異步服務器進程,這在處理多個客戶端時(例如在人工智能驅動的 API 或 Web 服務中)至關重要。
好處
- 更好地控制服務器連接:新方法允許精確控制客戶端連接的生命周期。close_clients()? 有助于優(yōu)雅地關閉連接,而abort_clients() 則在必要時強制終止連接。這些功能對于機器學習和人工智能服務非常有用,在這些服務中,實時處理來自各個客戶端的并發(fā)連接至關重要。
- 對于人工智能服務和 API 至關重要:人工智能驅動的應用程序通常需要同時處理多個客戶端請求,例如在人工智能即服務 (AIaaS) 平臺中。有效管理連接的能力對于維護此類服務的可靠性和性能至關重要。這些新方法使開發(fā)者能夠更靈活、更可控地處理這些連接。
5. 標準庫增強
Python 3.13 還對標準庫進行了一些更新,這些更新與機器學習和人工智能工作流程高度相關。這些增強功能有助于改進數(shù)據(jù)管理、提高效率并簡化機器學習和人工智能開發(fā)中許多典型任務的代碼。
5.1. base64 模塊增強
其中一項更值得注意的更新是添加了 base64.z85encode()? 和 base64.z85decode() 函數(shù)。Z85 編碼格式比傳統(tǒng)的 base64 更緊湊,使其成為編碼二進制數(shù)據(jù)的理想選擇。
好處
- 高效編碼二進制數(shù)據(jù):許多人工智能應用程序涉及處理二進制數(shù)據(jù),例如模型權重、圖像數(shù)據(jù)或序列化神經(jīng)網(wǎng)絡。Z85 編碼格式提供了一種更節(jié)省空間的方式,以文本友好的格式對這些數(shù)據(jù)進行編碼,使其更易于通過網(wǎng)絡傳輸或存儲在數(shù)據(jù)庫中。
- 促進數(shù)據(jù)傳輸和存儲:Z85 編碼對于在預期使用文本的系統(tǒng)(例如 JSON API 或數(shù)據(jù)庫)之間傳輸數(shù)據(jù)特別有用。通過高效地編碼二進制數(shù)據(jù),開發(fā)者可以節(jié)省存儲空間和帶寬,同時保持與那些更喜歡文本數(shù)據(jù)格式的系統(tǒng)的兼容性。
5.2. copy 模塊更新
Python 3.13 引入了新的 copy.replace() 函數(shù),該函數(shù)簡化了使用修改克隆對象的過程。這對于經(jīng)常使用復雜數(shù)據(jù)結構(例如神經(jīng)網(wǎng)絡配置或超參數(shù))的機器學習和人工智能從業(yè)者來說尤其有用。
好處
- 簡化克隆和修改復雜對象:在機器學習和人工智能工作流程中,通常需要復制模型配置或數(shù)據(jù)集等對象,但只需稍作修改。例如,在調整超參數(shù)或調整模型架構時,能夠以一種簡潔、高效的方式復制和替換值可以加快開發(fā)過程。
- 有助于調整神經(jīng)網(wǎng)絡配置:在迭代機器學習模型時,通常會復制現(xiàn)有配置,同時進行一些小的更改(例如,更改層參數(shù)或優(yōu)化器設置)。copy.replace() 函數(shù)允許您輕松創(chuàng)建復雜對象的修改副本,而無需手動修改每個參數(shù)。
5.3. 新的 dbm.sqlite3 模塊
Python 3.13 中另一個有價值的補充是新的 dbm.sqlite3 模塊,該模塊提供了一種輕量級的、基于文件的數(shù)據(jù)庫解決方案,使用 SQLite 作為后端。SQLite 在許多機器學習應用程序中廣泛用于存儲元數(shù)據(jù)、結果或其他鍵值數(shù)據(jù)。
好處
- 輕量級的、基于文件的數(shù)據(jù)庫解決方案:對于需要簡單數(shù)據(jù)庫解決方案的機器學習項目,例如存儲模型元數(shù)據(jù)、緩存中間結果或管理配置,dbm.sqlite3 模塊提供了一種易于使用的、基于文件的數(shù)據(jù)庫,而無需設置完整的數(shù)據(jù)庫服務器。
- 非常適合存儲元數(shù)據(jù)和緩存結果:在機器學習工作流程中,通常需要一個快速、輕量級的數(shù)據(jù)庫來管理元數(shù)據(jù)或緩存中間計算的輸出。dbm.sqlite3 模塊利用了 SQLite 的簡單性和性能,使其成為此類用途的理想選擇。
6. 安全性和可靠性改進
Python 3.13 對安全性和可靠性進行了重要更新,這對于經(jīng)常涉及敏感數(shù)據(jù)和計算的人工智能應用程序來說尤為重要。這些增強功能確保機器學習和人工智能應用程序能夠更安全、更可靠地運行,尤其是在分布式環(huán)境中。
SSL 增強
Python 3.13 的一項關鍵改進是對 ssl.create_default_context() 方法的更新。它現(xiàn)在設置了更嚴格的默認標志,為網(wǎng)絡通信提供了增強的安全性。
好處
- 增強網(wǎng)絡通信的安全性:新的默認設置有助于確保 SSL/TLS 配置在默認情況下更安全。這對于依賴基于云的服務或 API 的人工智能應用程序來說尤為重要,這些應用程序通常通過 HTTPS 或其他安全協(xié)議進行交互。
- 對人工智能應用程序至關重要:許多人工智能驅動的應用程序(例如數(shù)據(jù)處理管道和基于云的機器學習服務)都需要安全的通信,以確保數(shù)據(jù)完整性和隱私。這些更嚴格的默認設置有助于防止網(wǎng)絡通信中的漏洞,確保敏感數(shù)據(jù)(例如用戶輸入或模型預測)能夠安全傳輸。
引入“PythonFinalizationError”異常
Python 3.13 還引入了 PythonFinalizationError 異常,當在解釋器的終止階段嘗試某些操作時會引發(fā)此異常。這是一項關鍵的補充,可確保在關閉期間正確清理資源。
好處
- 有助于識別和正確處理清理操作:在機器學習和人工智能應用程序中,通常會分配大量資源,例如 GPU、文件句柄和數(shù)據(jù)集。PythonFinalizationError 幫助開發(fā)者查明在關閉期間導致問題的操作,確保安全釋放這些資源。
- 確保正確釋放 GPU 和數(shù)據(jù)文件等資源:在使用 GPU 等硬件加速器或存儲在內存中的大型數(shù)據(jù)集時,必須確保在應用程序生命周期結束時釋放這些資源。新的異常有助于在清理過程中捕獲錯誤,防止?jié)撛诘馁Y源泄漏,并確保機器學習管道順利關閉。
7. 平臺支持更新
Python 3.13 大幅擴展了平臺支持,使其更容易在不同環(huán)境(包括移動設備和 Web 瀏覽器)中部署機器學習和人工智能模型。對于希望構建能夠在更廣泛的設備上運行的人工智能應用程序的開發(fā)者來說,這些更新開辟了新的可能性。
對 iOS (PEP 730) 和 Android (PEP 738) 的官方支持
Python 首次在 Tier 3 層級上正式支持 iOS 和 Android 平臺。對于希望將人工智能模型和服務引入移動設備的開發(fā)者來說,這是一項重大更新。
好處
- 簡化人工智能模型在移動設備上的開發(fā)和部署:人工智能模型現(xiàn)在可以更輕松地部署在 iOS 和 Android 設備上,無論是作為獨立應用程序還是作為更大的移動人工智能平臺的一部分。這對于需要在邊緣設備上實現(xiàn)實時機器學習功能的應用程序(例如圖像分類、目標檢測或增強現(xiàn)實)至關重要。
- 擴大人工智能應用程序的覆蓋范圍:通過正式支持 iOS 和 Android,Python 使人工智能開發(fā)者能夠接觸到更廣泛的用戶。移動人工智能助手、健康監(jiān)測應用程序和實時分析工具等應用程序現(xiàn)在可以受益于 Python 強大的機器學習框架。
WebAssembly 支持
Python 3.13 還通過支持 wasm32-wasi 作為 Tier 2 平臺,將 WebAssembly (Wasm) 支持提升到了一個新的水平。
好處
- 能夠在 Web 環(huán)境中運行 Python 人工智能代碼:借助 WebAssembly,開發(fā)者可以直接在 Web 瀏覽器中運行 Python 代碼,從而實現(xiàn)客戶端機器學習應用程序。這對于輕量級的、實時的機器學習任務(例如圖像或文本分析)特別有用,這些任務可以在瀏覽器本地處理,而無需服務器端計算。
- 為瀏覽器中的客戶端機器學習應用程序開辟了可能性:借助 WebAssembly 支持,開發(fā)者可以直接在瀏覽器中部署機器學習模型。這為創(chuàng)建交互式、注重隱私的應用程序開辟了可能性,在這些應用程序中,數(shù)據(jù)在客戶端進行處理,從而減少了向服務器傳輸數(shù)據(jù)的需求。
8. 發(fā)布計劃變更(PEP 602 更新)
Python 3.13 延長了版本支持周期,使開發(fā)者能夠更輕松地規(guī)劃長期項目并保持兼容性。
延長全面支持期限
PEP 602 中最值得注意的變化之一是將 Python 版本的全面支持(“錯誤修復”)期限從一年半延長至兩年。這意味著 Python 版本現(xiàn)在將獲得更長時間的全面支持,然后是三年的安全修復。
好處
- 為人工智能項目提供更長的穩(wěn)定性:對于需要長期穩(wěn)定性的人工智能項目,此擴展的支持窗口意味著開發(fā)者可以更長時間地依賴 Python 3.13,而無需頻繁升級。這對于部署在生產環(huán)境中并需要長時間保持穩(wěn)定的人工智能模型尤為重要。
- 減少主要升級的頻率:更長的支持期限減少了在 Python 版本之間頻繁遷移的需求,從而最大限度地減少了對正在進行的機器學習項目的干擾,并減少了與代碼庫重構或升級相關的開銷。
對長期項目的影響
更長的支持期限提供了更可預測的維護計劃,使人工智能團隊能夠更有策略地規(guī)劃升級。
好處
- 更可預測的維護計劃:憑借兩年的全面支持期限,機器學習工程師可以更好地規(guī)劃其升級周期,因為他們知道錯誤修復和安全更新將在更長時間內提供。
- 更容易規(guī)劃未來的更新和兼容性:人工智能項目,尤其是在醫(yī)療保健、金融或自動駕駛系統(tǒng)等行業(yè),需要長期穩(wěn)定性和謹慎的升級規(guī)劃。Python 3.13 擴展的發(fā)布計劃使其更容易將這些項目與未來的 Python 版本保持一致,確保版本之間的平穩(wěn)過渡。
如果您從事機器學習和人工智能方面的工作,現(xiàn)在是探索 Python 3.13 中新功能的最佳時機。在您的開發(fā)環(huán)境中測試實驗性的自由線程和 JIT 編譯器,看看它們如何改進您的工作負載。深入了解增強的類型系統(tǒng)和平臺支持,以簡化您的開發(fā)和部署工作流程。
雖然 Python 3.13 帶來了強大的新功能,但有些功能(如自由線程解釋器和 JIT 編譯器)仍處于實驗階段。在將這些功能部署到生產環(huán)境之前,必須在開發(fā)環(huán)境中對其進行全面測試,以確保穩(wěn)定性以及與現(xiàn)有代碼庫的兼容性。
本文轉載自 ??DevOpsAI??,作者: Python
