Stories

Detail Return Return

在 Ubuntu 22.04 中編譯 tensorflow 2,並調試源代碼 - Stories Detail

引言

本文描述如何在 Ubuntu 22.04 中編譯 tensorflow 2 源碼,以及如何生成 Python 代碼包,並能夠調試 tensorflow 源碼,包括單步執行、觀察變量和表達式等能力。

準備工作

請參照各自官方文檔準備所需環境,在此不再贅述。
  • Ubuntu 22.04, Windows 用户推薦使用 WSL 2。
  • Python 3.10 ~ 3.12,安裝在 Ubuntu 22.04 中。其中 Python 3.10 為 Ubuntu 22.04 默認分發版本。
  • LLVM 16,安裝在 Ubuntu 22.04 中。
  • Bazel 最新版,安裝在 Ubuntu 22.04 中。
  • Visual Studio Code 最新版,用於調試 tensorflow。截至發稿時,使用的版本為 1.85.1。

準備 Ubuntu 22.04

  1. 參考文章:https://aka.ms/wsl2 安裝 Ubuntu 22.04。
  2. 參考文章:https://www.tensorflow.org/install/source?hl=zh-cn 中的“Linux 和 macOS 設置”、“配置 build”和“構建 pip 軟件包” 準備構建 tensorflow 的環境。

編譯帶調試符號的 tensorflow 安裝包

按照 tensorflow 官方文檔説明編譯的代碼包不包含調試符號。使用不帶調試符號的 tensorflow 無法實現 tensorflow 源碼級的調試。
因此,實際的編譯命令為:

bazel build -c dbg --copt="-O0" --copt="-g"  --cxxopt="-O0" --cxxopt="-g" --strip=never --copt="-mavx" --cxxopt="-mavx" //tensorflow/tools/pip_package:build_pip_package�

其中:
--copt--cxxopt 為編譯參數。-O0 為優化級別為0,即不優化。-g 為編譯時帶調試符號。-c dbg 為編譯用於調試的代碼包。--strip=never 表示編譯後的二進制文件不適用條帶化。-mavx 表示啓用 avx 指令集。

注意:

  1. 暫不啓用 cuda。
  2. 首次編譯過程中需要在線更新第三方依賴代碼包。中國大陸訪問部分代碼包可能受限。

建議:

  1. 選定 Python 版本和 tensorflow 版本後再編譯,如 Python 3.10 和 tensorflow 源代碼的 v2.15.0 分支。使用 Python 的 virtualenv 代碼包創建虛擬空間並啓用,在虛擬空間下編譯 tensorflow。
  2. 帶符號的代碼包可能體積非常大,需要準備較高的磁盤空間和內存空間。如果需要較好的寫入速度,推薦使用固態硬盤。

配置 Visual Studio Code

需要將 Visual Studio Code 安裝到 WSL-Ubuntu-22.04 中,然後再準備下述條件:

需要的插件
  1. C/C++
  2. C/C++ Extension Pack
  3. Chinese (Simplified) (簡體中文) Language Pack for Visual Studio Code
  4. clangd
  5. Pylance
  6. Pylint
  7. Python
  8. Python C++ Debuger
  9. Python Extension Pack
運行和調試配置
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python C++ Debugger",
            "type": "pythoncpp",
            "request": "launch",
            "pythonConfig": "custom",
            "pythonLaunchName": "Python: Current File",
            "cppConfig": "custom",
            "cppAttachName": "(lldb) Attach"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": false,
            "subProcess": true,
            "env": {
                "PYTHONPATH": "${workspaceFolder}"
            }
        },
        {
            "name": "(lldb) Attach",
            "type": "lldb",
            "request": "attach",
            "pid": "${command:pickMyProcess}",
            "sourceMap": {
                "/proc/self/cwd/external": "${workspaceFolder}/tensorflow/bazel-out/k8-dbg/bin/tensorflow/tools/pip_package/build_pip_package.runfiles/org_tensorflow/external",
                "/proc/self/cwd": "${workspaceFolder}/tensorflow",
            }
        }
    ]
}
注意:上述配置中的 sourceMap 請根據實際情況調整。如果在調試過程中看到了彙編,且彙編包含了文件和函數標記,則表明源代碼映射沒成功。
user avatar free_like_bird Avatar soroqer Avatar spacewander Avatar xiaohe0601 Avatar gongzhengyang Avatar chanmufeng Avatar gouguoyin Avatar youngcoding Avatar wanmuc Avatar
Favorites 9 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.