」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 機器學習中的 C++:逃離 Python 與 GIL

機器學習中的 C++:逃離 Python 與 GIL

發佈於2024-11-08
瀏覽:778

C   in Machine Learning : Escaping Python

介紹

當 Python 的全域解釋器鎖定 (GIL) 成為需要高並發或原始效能的機器學習應用程式的瓶頸時,C 提供了一個引人注目的替代方案。這篇部落格文章探討如何利用 C 語言進行 ML,並專注於效能、並發性以及與 Python 的整合。

閱讀完整的部落格!

了解 GIL 瓶頸

在深入探討 C 之前,我們先澄清一下 GIL 的影響:

  • 並發限制:GIL 確保一次只有一個執行緒執行 Python 字節碼,這會嚴重限制多執行緒環境中的效能。

  • 受影響的用例:即時分析、高頻交易或密集模擬中的應用程式經常受到此限制。

為什麼選擇 C 進行機器學習?

  • 沒有 GIL:C 沒有與 GIL 等效的東西,允許真正的多線程。

  • 效能:直接記憶體管理與最佳化功能可以帶來顯著的加速。

  • 控制:對硬體資源的細微控制,對於嵌入式系統或與專用硬體連接時至關重要。

程式碼範例和實現

設定環境

在我們編碼之前,請確保您擁有:

  • 現代 C 編譯器(GCC、Clang)。
  • CMake 用於專案管理(可選但建議)。
  • 像 Eigen 這樣的線性代數運算的函式庫。

C 中的基本線性迴歸

#include 
#include 
#include 

class LinearRegression {
public:
    double slope = 0.0, intercept = 0.0;

    void fit(const std::vector& X, const std::vector& y) {
        if (X.size() != y.size()) throw std::invalid_argument("Data mismatch");

        double sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;
        for (size_t i = 0; i  x = {1, 2, 3, 4, 5};
    std::vector y = {2, 4, 5, 4, 5};

    lr.fit(x, y);

    std::cout 



使用 OpenMP 進行平行訓練

展示併發性:

#include 
#include 

void parallelFit(const std::vector& X, const std::vector& y, 
                 double& slope, double& intercept) {
    #pragma omp parallel
    {
        double local_sum_x = 0, local_sum_y = 0, local_sum_xy = 0, local_sum_xx = 0;

        #pragma omp for nowait
        for (int i = 0; i 



使用特徵值進行矩陣運算

對於邏輯迴歸等更複雜的操作:

#include 
#include 

Eigen::VectorXd sigmoid(const Eigen::VectorXd& z) {
    return 1.0 / (1.0   (-z.array()).exp());
}

Eigen::VectorXd logisticRegressionFit(const Eigen::MatrixXd& X, const Eigen::VectorXd& y, int iterations) {
    Eigen::VectorXd theta = Eigen::VectorXd::Zero(X.cols());

    for (int i = 0; i 



與Python集成

對於 Python 集成,請考慮使用 pybind11:

#include 
#include 
#include "your_ml_class.h"

namespace py = pybind11;

PYBIND11_MODULE(ml_module, m) {
    py::class_(m, "YourMLClass")
        .def(py::init())
        .def("fit", &YourMLClass::fit)
        .def("predict", &YourMLClass::predict);
}

這允許您從 Python 呼叫 C 程式碼,如下所示:

import ml_module

model = ml_module.YourMLClass()
model.fit(X_train, y_train)
predictions = model.predict(X_test)

挑戰與解決方案

  • 記憶體管理:使用智慧指標或自訂記憶體分配器來有效率且安全地管理記憶體。

  • 錯誤處理:C 沒有 Python 的異常處理來進行開箱即用的錯誤管理。實施強大的異常處理。

  • 庫支援:雖然 C 的 ML 函式庫比 Python 少,但 Dlib、Shark 和 MLpack 等專案提供了強大的替代方案。

結論

C 提供了一種繞過 Python 的 GIL 限制的途徑,為效能關鍵的 ML 應用程式提供了可擴展性。雖然由於其較低的性質,它需要更仔細的編碼,但速度、控制和並發性方面的好處可能是巨大的。隨著 ML 應用程式不斷突破界限,C 仍然是 ML 工程師工具包中的重要工具,尤其是與 Python 結合使用以方便使用時。

進一步探索

  • SIMD 操作:研究如何使用 AVX、SSE 來獲得更大的效能提升。
  • CUDA for C :用於 ML 任務中的 GPU 加速。
  • 進階 ML 演算法:以 C 語言實作神經網路或 SVM,以實現效能關鍵型應用。

感謝您與我一起深入研究!

感謝您花時間與我們一起探索 C 在機器學習中的巨大潛力。我希望這趟旅程不僅能啟發您克服 Python 的 GIL 限制,還能夠啟發您在下一個 ML 專案中嘗試使用 C。您對學習和突破技術極限的奉獻精神是推動創新前進的動力。不斷嘗試,不斷學習,最重要的是,不斷與社區分享您的見解。在我們下一次深入研究之前,祝您編碼愉快!

版本聲明 本文轉載於:https://dev.to/evolvedev/c-in-machine-learning-escaping-pythons-gil-2117?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-04-17
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-04-17
  • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    程式設計 發佈於2025-04-17
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣,如何? 答案:是的,可以將您的Encryption庫從McRypt升級到OpenSSL。 可以使用openssl。 附加說明: [openssl_decrypt()函數要求...
    程式設計 發佈於2025-04-17
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-04-17
  • JavaScript中如何動態訪問全局變量?
    JavaScript中如何動態訪問全局變量?
    在JavaScript 一種方法是使用窗口對象存儲和檢索變量。通過引用全局範圍,可以使用其名稱動態訪問變量。 //一個腳本 var somevarname_10 = 20; //另一個腳本 window.all_vars = {}; window.all_vars ['somevarna...
    程式設計 發佈於2025-04-17
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-04-17
  • 如何重置Postgres主鍵序列與表行不同步?
    如何重置Postgres主鍵序列與表行不同步?
    [2 解決PostgreSql主鍵序列差異 與表行未對準的主鍵序列可能會導致令人沮喪的重複鍵錯誤。這通常發生在數據導入或恢復未保留序列完整性的地方。 這是修復它的方法: 1。查找最高ID: 使用 max()[2 [2 2。獲取序列的下一個值: 此查詢顯示了序列的下一個生成值: sel...
    程式設計 發佈於2025-04-17
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-04-17
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-17
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-17
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​&&&&&&&&&&&&&&&默元組方法在...
    程式設計 發佈於2025-04-17
  • 解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    程式設計 發佈於2025-04-17
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-04-17
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-04-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3