Acerca del pozo súper grande de ML-Agents "Error de CUDA: no hay ninguna imagen del kernel disponible para ejecutar en el dispositivo"

Después del doloroso trabajo de construcción del entorno, todo es tan armonioso y natural en la superficie, solo esperando que active la función de entrenamiento para pasar un buen rato. Como resultado, el despiadado Bug está una vez más en la cara.
El proceso de aparición y resolución del problema se documenta a continuación.

Se puede navegar por la construcción del entorno: Un estudio preliminar sobre la conexión de Unity con agentes de aprendizaje automático

Después de completar la construcción del entorno, puede usar la demostración adjunta para familiarizarse con las funciones de acuerdo con la documentación oficial de Unity.

La documentación oficial está aquí.

1. Ocurrencia de problemas

Esta vez vamos a ejecutar 3D Balance Ball

inserte la descripción de la imagen aquí

Además de ejecutar directamente el proyecto de Unity para ver el efecto, también puede realizar operaciones de entrenamiento abriendo el ml-agentsentorno creado previamente, y este escollo se encuentra al iniciar el entrenamiento.

Abra Anaconda Prompt, luego active ml-agentsel entorno, cd al directorio de archivos de descompresión de la versión 20 e ingrese el siguiente comando:

mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun

¿Dónde config/ppo/3DBall.yamlestá la ruta al archivo de configuración de entrenamiento predeterminado oficial?
inserte la descripción de la imagen aquí
config/ppoLa carpeta contiene archivos de configuración de entrenamiento para todos los entornos de ejemplo, incluido 3DBall .
--run-id=Un nombre único que se usa para definir la sesión de entrenamiento, nombrada aquí first3DBallRun.
También puede agregar --forceun comando al final para indicar la ejecución obligatoria. Después del uso, se sobrescribirán los últimos datos. Si no hay escritura --forcey hay una carpeta con el mismo nombre, no se ejecutará.

mlagents-learn config/ppo/3DBall.yaml --run-id=first3DBallRun --force

Después de ejecutar el comando, en circunstancias normales, aparecerá la siguiente pantalla en la consola:
inserte la descripción de la imagen aquí
Al final, se le pedirá al usuario que inicie el proyecto Unity
[INFO] Listening on port 5004. Start training by pressing the Play button in the Unity Editor.

Después de eso, haga clic en Playel botón correspondiente a la escena en el proyecto de Unity. En circunstancias normales, debería aparecer una pantalla similar a la del documento oficial:

INFO:mlagents_envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy

INFO:mlagents_envs:Connected new brain:
Unity brain name: 3DBallLearning
        Number of Visual Observations (per agent): 0
        Vector Observation space size (per agent): 8
        Number of stacked Vector Observation: 1
INFO:mlagents_envs:Hyperparameters for the PPO Trainer of brain 3DBallLearning:
        batch_size:          64
        beta:                0.001
        buffer_size:         12000
        epsilon:             0.2
        gamma:               0.995
        hidden_units:        128
        lambd:               0.99
        learning_rate:       0.0003
        max_steps:           5.0e4
        normalize:           True
        num_epoch:           3
        num_layers:          2
        time_horizon:        1000
        sequence_length:     64
        summary_freq:        1000
        use_recurrent:       False
        memory_size:         256
        use_curiosity:       False
        curiosity_strength:  0.01
        curiosity_enc_size:  128
        output_path: ./results/first3DBallRun/3DBallLearning
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 1000. Mean Reward: 1.242. Std of Reward: 0.746. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 2000. Mean Reward: 1.319. Std of Reward: 0.693. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 3000. Mean Reward: 1.804. Std of Reward: 1.056. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 4000. Mean Reward: 2.151. Std of Reward: 1.432. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 5000. Mean Reward: 3.175. Std of Reward: 2.250. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 6000. Mean Reward: 4.898. Std of Reward: 4.019. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 7000. Mean Reward: 6.716. Std of Reward: 5.125. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 8000. Mean Reward: 12.124. Std of Reward: 11.929. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 9000. Mean Reward: 18.151. Std of Reward: 16.871. Training.
INFO:mlagents.trainers: first3DBallRun: 3DBallLearning: Step: 10000. Mean Reward: 27.284. Std of Reward: 28.667. Training.

En este punto, significa entrar en la sesión de entrenamiento.

Sin embargo, el problema que encontré fue que Unity salió de la ejecución de inmediato y la consola generó la siguiente información.

[WARNING] Trainer has no policies, not saving anything.
Traceback (most recent call last):
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\anaconda\Anaconda3\envs\ml-agents\Scripts\mlagents-learn.exe\__main__.py", line 7, in <module>
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\learn.py", line 264, in main
    run_cli(parse_command_line())
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\learn.py", line 260, in run_cli
    run_training(run_seed, options, num_areas)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\learn.py", line 136, in run_training
    tc.start_learning(env_manager)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents_envs\timers.py", line 305, in wrapped
    return func(*args, **kwargs)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_controller.py", line 172, in start_learning
    self._reset_env(env_manager)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents_envs\timers.py", line 305, in wrapped
    return func(*args, **kwargs)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_controller.py", line 107, in _reset_env
    self._register_new_behaviors(env_manager, env_manager.first_step_infos)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_controller.py", line 267, in _register_new_behaviors
    self._create_trainers_and_managers(env_manager, new_behavior_ids)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_controller.py", line 165, in _create_trainers_and_managers
    self._create_trainer_and_manager(env_manager, behavior_id)
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_controller.py", line 137, in _create_trainer_and_manager
    policy = trainer.create_policy(
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\ppo\trainer.py", line 194, in create_policy
    policy = TorchPolicy(
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\policy\torch_policy.py", line 41, in __init__
    GlobalSteps()
  File "C:\anaconda\Anaconda3\envs\ml-agents\lib\site-packages\mlagents\trainers\torch_entities\networks.py", line 748, in __init__
    torch.Tensor([0]).to(torch.int64), requires_grad=False
RuntimeError: CUDA error: no kernel image is available for execution on the device

Uno de los datos más importantes es:
RuntimeError: CUDA error: no kernel image is available for execution on the device

Después de eso, fue una buena comida. Hay aproximadamente dos argumentos:
1. La versión PyTorch no es compatible con la versión CUDA.
2. La potencia informática de la tarjeta gráfica es demasiado baja para admitir una versión superior de CUDA.

En ese momento, sentí pasar diez mil caballos de barro al galope. ¿ Qué es CUDA ? ? ?
La baja potencia informática de la tarjeta gráfica es, de hecho, un posible problema, ya que el modelo de tarjeta gráfica que se utiliza actualmente para el desarrollo NVIDIA GeForce GT 730es una tarjeta gráfica de gama relativamente baja.

CUDA (Arquitectura de dispositivo unificado de computación) es una plataforma informática lanzada por el fabricante de tarjetas gráficas NVIDIA. CUDA™ es una arquitectura informática paralela de propósito general presentada por NVIDIA que permite que las GPU resuelvan problemas informáticos complejos. Incluye la arquitectura de conjunto de instrucciones CUDA (ISA) y el motor de computación paralela dentro de la GPU. Los desarrolladores pueden usar el lenguaje C para escribir programas para la arquitectura CUDA™ que pueden ejecutarse con un rendimiento ultraalto en procesadores habilitados para CUDA™. CUDA3.0 ha comenzado a admitir C++ y FORTRAN.

Me sorprendió verlo directamente y sentí que estaba más allá del alcance del negocio.

2. Excluir la incompatibilidad entre la versión PyTorch y la versión CUDA

En primer lugar, dudé si el error se informó debido a PyTorchla CUDAdiscrepancia de la versión con , por lo que indagué sobre el método de inspección y la tabla correspondiente a la versión.

# 激活 ml-agents 环境,因为 PyTorch 是安装在该环境下的
(base) C:\Users\Administrator>activate ml-agents
# 进入 python 环境
(ml-agents) C:\Users\Administrator>python
Python 3.9.16 (main, Jan 11 2023, 16:16:36) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
# 引入 PyTorch 开发包
>>> import torch
# 打印 PyTorch 的版本号
>>> torch.__version__
'1.7.1+cu110'
# 打印 CUDA 版本
>>> torch.version.cuda
'11.0'
# 显示当前 CUDA 版本是否可用
>>> torch.cuda.is_available()
True
# 顺便打印了一下 gpu 的名字
>>> torch.cuda.get_device_name(0)
'NVIDIA GeForce GT 730'

Vaya al sitio web oficial de PyTorch para encontrar la relación entre las diferentes versiones PyTorchy CUDA.

inserte la descripción de la imagen aquí
Eso sí, aunque la imagen de la página de inicio es más intuitiva, solo muestra la correspondencia de la última versión.
En esta dirección , puede encontrar la relación correspondiente de versiones anteriores, e instalamos la 1.7.1versión de acuerdo con el documento de Unity antes
inserte la descripción de la imagen aquí
. Para obtener un cuadro de comparación más intuitivo, puede consultar este artículo .
Obviamente, las versiones actualmente instaladas PyTorchpueden CUDAcorresponder.

3. Verificación de coincidencia de CUDA y controlador de tarjeta gráfica

¡Ese es el problema con la tarjeta gráfica!
Sin embargo, no es fácil juzgar, porque:
Primero, cambiar la tarjeta gráfica es muy costoso. . .
En segundo lugar, hay algunas otras afirmaciones sobre este informe de error en Internet, por lo que aún se necesita una verificación adicional.

Porque encontré un artículo que CUDAse refiere aproximadamente al kit de desarrollo de software NVIDIA CUDA Toolkit .
PD: Pero después de todas las consultas, CUDAy CUDA Toolkitson dos conceptos diferentes, no puedes simplemente dibujar un signo igual.

CUDA (Arquitectura de Dispositivo Unificado de Computación) : La traducción literal es "Arquitectura de Computación Unificada". CUDA actualmente es compatible con varios idiomas (C++, JAVA, Python, etc.), y básicamente puede ejecutarse en la GPU NVIDIA más nueva, y el ámbito de uso sigue siendo relativamente amplio.
CUDA Toolkit : herramientas de desarrollo de CUDA, incluidas las siguientes partes: compilador (compilador), herramientas, bibliotecas, muestras de CUDA, controlador de CUDA (si solo ejecuta código de aprendizaje profundo en la gpu, puede descargar el controlador de CUDA por separado).

Por lo tanto, la suposición actual es mirar CUDAla información correspondiente de y la tarjeta gráfica, así que fui al sitio web oficial de CUDA , y hay algunas tablas de correspondencia que muestran la CUDA Toolkitcorrespondencia entre y el controlador de la tarjeta gráfica.
inserte la descripción de la imagen aquí
Basándome en esta tabla, juzgo que la causa del problema puede deberse a la CUDAfalta de coincidencia entre el controlador de la tarjeta gráfica y la versión (porque al principio estaba muy confundido, pensando que el problema de la potencia informática y CUDA se refiere a la compatibilidad entre el controlador de la tarjeta gráfica y la versión de CUDA Toolkit, pero finalmente descubrió que no es lo mismo).

Hay dos formas de comprobar el controlador de la placa:

1. Ver a través del panel de control de NVIDIA
  • Presione simultáneamente Win + Qla combinación de teclas para llamar a la barra de búsqueda, busque "Panel de control"
  • haga clic para abrirNVIDIA 控制面板

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Como puede ver, la versión actual del controlador es472.12

Después de eso, haga clic en "Ayuda" -> "Información del sistema", seleccione la pestaña "Componentes" y podrá ver el CUDA compatible con la computadora actual
inserte la descripción de la imagen aquí

2. Ver a través de la consola cmd

Puede ver la versión del controlador y otros detalles usando comandos a través de cmd

C:\Users\Administrator>nvidia-smi

Si no es válido, significa que la información de ruta no está configurada.

La ruta predeterminada del controlador de NVIDIA es: C:\Program Files\NVIDIA Corporation\NVSMI, agregue esta ruta a la ruta en la variable de entorno del sistema y reinicie cmd para usar el comando.
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Se puede ver que la versión del controlador es 472.12, y CUDAla versión es 11.4
inserte la descripción de la imagen aquí
.Después de la comparación, la CUDAfalta de coincidencia entre el controlador de la tarjeta gráfica y .

4. Confirmación de contenido actualizado en documentos oficiales de ML-Agents

En ese momento, mi cabeza estaba realmente llena de signos de interrogación. . . Así que revisé nuevamente, hasta que accidentalmente leí la información de cambio de la versión 20.

inserte la descripción de la imagen aquí

Otros 10.000 caballos de hierba y barro pasaron por mi corazón, y hubo errores en los documentos oficiales de coautoría. . .

Así que abra el entorno nuevamente ml-agentsy ejecute el comando para desinstalar el actualPyTorch

pip3 uninstall torch

Luego ejecuta el siguiente comando:

conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge

-c conda-forgeIndica descargar este paquete en la biblioteca conda-forge cudatoolkit 11.1.
Verificar el éxito después de la instalación
inserte la descripción de la imagen aquí

Después de probar lo siguiente, el resultado sigue siendo el mismo error, lo divido.

5. Resolviendo el problema: Compatibilidad entre la potencia informática de la tarjeta gráfica y CUDA

Después de pensarlo, puede ser un problema que la tarjeta gráfica en sí no sea compatible. Es fácil comprobarlo de nuevo. Encontré en un artículo que, desde , las tarjetas gráficas con una potencia de cálculo de GPU de 3.5 e inferior ya no PyTorch 1.3son compatibles.
Entonces, usando esto como pista, pregunté sobre la demanda de poder de cómputo de tarjetas gráficas en el proceso de desarrollo de IA.

Las conclusiones que se extraen son:
1. Existe una relación de correspondencia PyTorchcon CUDA.
2. CUDATambién existe una relación correspondiente con la potencia informática de la tarjeta gráfica.
3. Las diferentes versiones PyTorchtambién tienen requisitos para la potencia informática de la tarjeta gráfica.

Si hay alguna insatisfacción en esto, surgirán problemas.

Capacidad de cómputo:

La capacidad de cómputo de un dispositivo está representada por un número de versión, también llamado a veces su "versión SM". Este número de versión identifica las funciones compatibles con el hardware de la GPU y las aplicaciones lo utilizan en tiempo de ejecución para determinar qué funciones y/o instrucciones de hardware están disponibles en la GPU actual.
La capacidad de cómputo comprende un número de revisión mayor X y un número de revisión menor Y y se denota por XY
Los dispositivos con el mismo número de revisión principal tienen la misma arquitectura central. El número de revisión principal es 9 para dispositivos basados ​​en la arquitectura de GPU NVIDIA Hopper, 8 para dispositivos basados ​​en la arquitectura de GPU NVIDIA Ampere, 7 para dispositivos basados ​​en la arquitectura Volta, 6 para dispositivos basados ​​en la arquitectura Pascal, 5 para dispositivos basados ​​en la arquitectura Maxwell, y 3 para dispositivos basados ​​en la arquitectura Kepler.
El número de revisión menor corresponde a una mejora incremental de la arquitectura central, que posiblemente incluya nuevas características.
Turing es la arquitectura para dispositivos con capacidad de cómputo 7.5 y es una actualización incremental basada en la arquitectura Volta.
Las GPU habilitadas para CUDA enumeran todos los dispositivos habilitados para CUDA junto con su capacidad informática. Capacidades informáticas proporciona las especificaciones técnicas de cada capacidad informática.

Nota
La versión de capacidad de cómputo de una GPU en particular no debe confundirse con la versión de CUDA (por ejemplo, CUDA 7.5, CUDA 8, CUDA 9), que es la versión de la plataforma de software CUDA. Los desarrolladores de aplicaciones utilizan la plataforma CUDA para crear aplicaciones que se ejecutan en muchas generaciones de arquitecturas de GPU, incluidas las futuras arquitecturas de GPU que aún no se han inventado. Si bien las nuevas versiones de la plataforma CUDA a menudo agregan soporte nativo para una nueva arquitectura de GPU al admitir la versión de capacidad informática de esa arquitectura, las nuevas versiones de la plataforma CUDA generalmente también incluyen características de software que son independientes de la generación de hardware.
Las arquitecturas Tesla y Fermi ya no son compatibles a partir de CUDA 7.0 y CUDA 9.0, respectivamente.

traducción aproximada:

Las capacidades informáticas de un dispositivo se indican mediante un número de versión, a veces denominado "versión SM". Este número de versión identifica las funciones compatibles con el hardware de GPU y las aplicaciones lo utilizan en tiempo de ejecución para determinar qué funciones o instrucciones de hardware están disponibles en la GPU actual.
Las capacidades informáticas incluyen un número de versión mayor X y un número de versión menor Y, indicado por XY.
Los dispositivos con el mismo número de versión principal tienen la misma arquitectura central. Los principales números de versión son:
8 para dispositivos basados ​​en la arquitectura NVIDIA Ampere GPU,
7 para dispositivos basados ​​en la arquitectura Volta,
6 para dispositivos basados ​​en la arquitectura Pascal,
5 para dispositivos basados ​​en la arquitectura Maxwell,
3 para dispositivos basados ​​en la arquitectura Dispositivos de arquitectura Kepler,
2 para dispositivos basados ​​en Fermi,
1 para dispositivos basados ​​en Tesla.
Los números de revisión menores corresponden a mejoras incrementales en la arquitectura central, que posiblemente incluyan nuevas características.

Hay mucho bla, bla, lo que más o menos significa que este "poder de cómputo" no se refiere simplemente al poder de cómputo, sino que también tiene otros significados.

CUDAPuede consultar el WIKI directamente o consultar este blog para comparar, y también hay valores de hashrate para diferentes tipos de tarjetas gráficas.

inserte la descripción de la imagen aquí
Esta imagen es una captura de pantalla de WIKI.
La computadora que uso es CUDA 11.4 Aunque la imagen muestra una tarjeta gráfica (NVIDIA GeForce GT 730) que puede admitir una potencia de cómputo de 3.5, se informará un error cuando se ejecute el algoritmo ai.
Posteriormente, traté de configurar el entorno con mi computadora en casa, y el resultado fue un pase de una sola vez. de la tarjeta gráfica. Pero en casa, lo descargué directamente del documento ML-Agents PyTorch 1.7.1y puede ejecutarse normalmente, por lo que estoy algo confundido.
Luego, encontré una computadora portátil con tarjeta gráfica NVIDIA GeForce GTX 1070 en la empresa e intenté instalarla. Para evitar otras polillas, la operación de formateo se realizó con anticipación. Como resultado, tomó un día entero instalarlo, y hubo algunos otros problemas en el medio, pero al final se consideró fluido, es decir, el problema esta vez fue que el poder de cómputo del La tarjeta gráfica no era suficiente.
En este punto, el problema está resuelto.


PD: Problemas encontrados al instalar en una computadora portátil [WinError 1455]页面文件太小,无法完成操作。

La causa del problema: en la computadora portátil, debido a que Cel disco es una unidad de estado sólido relativamente pequeña, instalé ANACONDAel disco en el disco duro mecánico , pero la computadora no asigna tanta memoria virtual Da discos que no sean el disco de manera predeterminada Los problemas anteriores se deben a que no hay suficiente memoria virtual.C

Solución:
Primero, abra la interfaz del panel de controlWin + Q a través de la combinación de teclas de . Luego encienda el sistema . Seleccione Configuración avanzada del sistema para abrir la página Propiedades del sistema . Haga clic en el botón Configuración en la pestaña Avanzado para ingresar a la página Opciones de rendimiento . En la página Opciones de rendimiento, seleccione la pestaña Avanzado , luego haga clic en Opciones de programa y haga clic en el botón Cambiar . El estilo de página predeterminado es el siguiente: primero desmarque la marca superior, luego haga clic en la unidad para asignar memoria virtual, haga clic en tamaño personalizado y asigne la memoria virtual apropiada (si es 10G, complete 10240), luego haga clic en el botón de configuración y finalmente haga clic en el botón confirmar para salir de la página y reiniciar la computadora. Después de algunas operaciones, el problema fue reportado y solucionado.
inserte la descripción de la imagen aquí


inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/EverNess010/article/details/129199874
Recomendado
Clasificación