Depuración de partes C++ de Pytorch

Hable sobre la función de depuración de VSCode para código C++

tareas.json no es necesario cada vez

Si solo queremos usar la ventana de depuración de VSCode para depurar el archivo ejecutable que hemos generado, entonces no lo necesitamos en absolutotasks.json . Este archivo es un archivo de ayuda para la compilación. tasks.jsonDespués de configurar los parámetros, ejecute el comando set gcc Espere a compilar. Si ya hemos compilado, no necesitamos esta cosa.

Solo necesitamos launch.jsonarchivos, el siguiente es un ejemplo que configuré:

{  
    "version": "0.2.0",  
    "configurations": [  
        {  
            "name": "debug",  
            "type": "cppdbg",  
            "request": "launch",  
            "program": "path/to/bin",  
            "args": [  
                "--model-repository=/test_model_repository_debug/centernet-trt-ensemble",  
                "--http-port=8007",  
                "--cuda-memory-pool-byte-size=0:134217728"  
            ],  
            "stopAtEntry": false,  
            "cwd": "${workspaceFolder}",  
            "environment": [{"name":"LD_LIBRARY_PATH", "value":"${LD_LIBRARY_PATH}:/usr/local/cuda/lib64:/home/re2/obj/so"},  
                            {"name":"CUDA_VISIBLE_DEVICES","value": "4"}],  
            "externalConsole": false,  
            "MIMode": "gdb",  
            "setupCommands": [  
                {  
                    "description": "Enable pretty-printing for gdb",  
                    "text": "-enable-pretty-printing",  
                    "ignoreFailures": true  
                }  
            ],  
            "miDebuggerPath": "/usr/bin/gdb",  
            "logging": { "engineLogging": true }  
        }  
    ]  
}  

Analicemos algunos de nuestros lugares de uso común:

  • eliminar preLaunchTask": "g++", porque no necesitamostasks.json

  • "request": "launch"En general launch, si necesita capturar el proceso para adjuntarlo, configúrelo en attach, puede ver cómo DEBUG "profundo" para Pytorch

  • "program": "path/to/bin"La dirección del archivo ejecutable compilado

  • "args": [ ],Parámetros de línea de comando, cómo escribir el aspecto específico en la parte superior

  • "environment": [{"name":"CUDA_VISIBLE_DEVICES","value": "4"}],Variable de entorno, si nuestro archivo ejecutable necesita establecer una variable de entorno, modifique esto, modifique el formato y vea el ejemplo anterior

No se presentarán otros que no son de uso común. Si desea obtener más información, puede consultar el documento oficial https://code.visualstudio.com/docs/editor/debugging.

 héroe_depuración

Depurar todo el camino desde python a C++

Además de depurar C++, también hay algunas bibliotecas que son una combinación de C++ y python (como Pytorch, TVM), que es equivalente a una capa de python envuelta alrededor del núcleo de C++. Encontró este tipo de biblioteca de software, o necesitamos construir una biblioteca de software similar, ¿cómo depurar en esta situación?

Nuestra depuración de Pytorch generalmente se realiza en el lado de python, lo cual es suficiente para la tarea general de construir modelos. Pero si necesitamos hacer algunas modificaciones a Pytorch o estudiar cómo se construye la máquina o el sistema de aprendizaje profundo, debemos involucrar el nivel de código fuente de C ++ si queremos explorar en profundidad. Por ejemplo, para torch.rand(3, 4)esta función, en Python, no podemos ingresar su implementación interna a través de la depuración del lado de python, ni podemos encontrar su definición y, naturalmente, no podemos explorar sus detalles específicos de implementación. Por lo tanto, para explorar y depurar Pytorch mejor, Es necesario depurar la parte C++ de Pytorch.

Preparación

En primer lugar, necesitamos Pycharm+VSCODE (lado de Linux) y, por supuesto, el entorno de python y gdb (esto está generalmente disponible), luego crea un entorno virtual y compila el código fuente de Pytorch. Como queremos depurar el código fuente de Pytorch, primero debemos compilar el código fuente de Pytorch. Al compilar, debe modificar la variable de entorno DEBUG y compilar la versión de depuración de pytorch. El comando es DEBUG=1 python setup.py install, para obtener pasos de compilación más detallados, consulte el siguiente artículo, y no entraré en detalles aquí:

  • Una guía concisa para la compilación del código fuente de Pytorch

Después de compilar Pytorch, usamos VSCODE para abrir el directorio de Pytorch, abrimos todo el archivo del proyecto y luego hacemos clic en el ícono de depuración a la izquierda para comenzar a depurar por primera vez, VSCODE nos pedirá que agreguemos un archivo de configuración, que está en el launch.jsondirectorio .vscode_

Luego modificamos launch.jsonel archivo, principalmente para modificar la columna del programa a la ruta del intérprete de python, y no cambiamos los demás:

"name": "(gdb) Attach",  
"type": "cppdbg",  
"request": "attach",  
"program": "/home/prototype/anaconda3/envs/pytorch/bin/python", -- 修改这一栏为你执行pytorch的python路径  
"processId": "${command:pickProcess}",  
"MIMode": "gdb",  
"setupCommands": [  
    {  
        "description": "Enable pretty-printing for gdb",  
        "text": "-enable-pretty-printing",  
        "ignoreFailures": true  
    }  
]  
Empezar a depurar

El principio de nuestra depuración es:

  • Primero ejecute el código python para obtener el número de proceso de identificación que se está ejecutando actualmente

  • En segundo lugar, capture el número de proceso a través de gdb y luego depure el código C++

Debido a que hay un proceso de captura, para evitar que el programa se ejecute a través del punto de interrupción que establecimos en C++ antes de capturar, primero debemos agregar una declaración de suspensión al archivo .py que queremos ejecutar y dejar que el programa vuele en el aire Después de un tiempo, generalmente decido el tiempo yo mismo time.sleep(50). Además, establezca un punto de interrupción en el código C++ que desea romper por adelantado y haga clic en la línea de código que desea romper en VScode para configurarlo. Luego ejecute el código pytorch en modo de depuración (haga clic en el botón de depuración en pycharm), y podrá ver que el proceso en este momento es 28536 en la consola .

Verifique el número de proceso

Haga clic en depurar en VSCODE, que hemos configurado antes:  haga clic en el pequeño punto verde

En este momento, ingrese nuestro número de proceso anterior para adjuntar. Tenga en cuenta que el sistema puede requerir privilegios de root en este momento, solo ingrese y para confirmar. Ingrese el número de proceso

Después de esperar un rato (el tiempo de time.sleep), podemos ver que el programa se detuvo en el punto de interrupción que establecimos.En este momento, hemos ingresado al backend C++ desde el frontend python de pytorch: hemos bloqueado la fuente C++ código 

La información de depuración es la siguiente: whaosoft  aiot  http://143ai.com  

GNU gdb (Ubuntu 8.2-0ubuntu1~16.04.1) 8.2  
Copyright (C) 2018 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>  
This is free software: you are free to change and redistribute it.  
There is NO WARRANTY, to the extent permitted by law.  
Type "show copying" and "show warranty" for details.  
This GDB was configured as "x86_64-linux-gnu".  
Type "show configuration" for configuration details.  
For bug reporting instructions, please see:  
<http://www.gnu.org/software/gdb/bugs/>.  
Find the GDB manual and other documentation resources online at:  
    <http://www.gnu.org/software/gdb/documentation/>.  
  
For help, type "help".  
Type "apropos word" to search for commands related to "word".  
Warning: Debuggee TargetArchitecture not detected, assuming x86_64.  
=cmd-param-changed,param="pagination",value="off"  
[New LWP 15524]  
[New LWP 15525]  
[New LWP 15528]  
[Thread debugging using libthread_db enabled]  
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".  
0x00007fe9efc605d3 in select () at ../sysdeps/unix/syscall-template.S:84  
Loaded '/lib/x86_64-linux-gnu/libpthread.so.0'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libc.so.6'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libdl.so.2'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libutil.so.1'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/librt.so.1'. Symbols loaded.  
Loaded '/lib/x86_64-linux-gnu/libm.so.6'. Symbols loaded.  
Loaded '/lib64/ld-linux-x86-64.so.2'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_heapq.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_opcode.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/zlib.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libz.so.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_lzma.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../liblzma.so.5'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/grp.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_posixsubprocess.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/select.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_hashlib.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libcrypto.so.1.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_blake2.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_sha3.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_bisect.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_random.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_struct.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/binascii.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_socket.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_datetime.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_ssl.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libssl.so.1.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libffi.so.6'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/_mklinit.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_rt.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libiomp5.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/bin/../lib/libgcc_s.so.1'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/core/_multiarray_umath.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_pickle.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/core/_multiarray_tests.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/linalg/lapack_lite.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/linalg/_umath_linalg.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_decimal.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/fft/fftpack_lite.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/mkl_fft/_pydfti.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/random/mtrand.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_core.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_intel_thread.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_intel_lp64.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_avx512.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/numpy/../../../libmkl_vml_avx512.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_json.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/pyexpat.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/fcntl.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/termios.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/resource.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/array.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_multiprocessing.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_asyncio.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/../../libsqlite3.so.0'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/unicodedata.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/lib-dynload/_lsprof.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/_C.cpython-36m-x86_64-linux-gnu.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libshm.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libtorch_python.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libstdc++.so.6'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libtorch.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/lib/libc10.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libmkl_gnu_thread.so'. Symbols loaded.  
Loaded '/home/prototype/anaconda3/envs/pytorch/lib/libgomp.so.1'. Symbols loaded.  
Loaded '/usr/lib/libmpi_cxx.so.1'. Symbols loaded.  
Loaded '/usr/lib/libmpi.so.12'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libnuma.so.1'. Symbols loaded.  
Loaded '/usr/lib/libibverbs.so.1'. Symbols loaded.  
Loaded '/usr/lib/libopen-rte.so.12'. Symbols loaded.  
Loaded '/usr/lib/libopen-pal.so.13'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libhwloc.so.5'. Symbols loaded.  
Loaded '/usr/lib/x86_64-linux-gnu/libltdl.so.7'. Symbols loaded.  
[Switching to thread 4 (Thread 0x7fe9de0e0700 (LWP 15528))](running)  
=thread-selected,id="4"  
  
Thread 1 "python" hit Breakpoint 4, torch::autograd::THPVariable_rand (self_=0x0, args=0x7fe9df2cff08, kwargs=0x0) at ../torch/csrc/autograd/generated/python_torch_functions.cpp:8134  
8134   }, /*traceable=*/true);  
Execute debugger commands using "-exec <command>", for example "-exec info registers" will list registers in use (when GDB is the debugger)  

Puede ver que alcanzamos Breakpoint 4 con éxito . En este punto, puede depurar felizmente Pytorch con VSCODE. El método de depuración en este momento no es diferente de la depuración anterior de C++ solo.

Supongo que te gusta

Origin blog.csdn.net/qq_29788741/article/details/131745717
Recomendado
Clasificación