Питон.СЕТЬ , тензорный поток и CUDA: Не удалось загрузить динамическую библиотеку ‘cublas64_11.dll’

#python #c# #tensorflow #tensorflow2.0 #python.net

Вопрос:

В настоящее время я работаю над использованием Python.NET для создания сред C# для агентов взаимодействия TensorFlow и получаю ошибку TensorFlow при попытке загрузить библиотеки DLL Cuda.

Когда я запускаю чистые примеры python, тензорный поток загружает библиотеки DLL CUDA без проблем:

 2021-04-19 03:22:41.062449: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-04-19 03:22:41.062943: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublas64_11.dll
2021-04-19 03:22:41.063347: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cublasLt64_11.dll
2021-04-19 03:22:41.063709: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cufft64_10.dll
2021-04-19 03:22:41.064088: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library curand64_10.dll
2021-04-19 03:22:41.064455: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusolver64_10.dll
2021-04-19 03:22:41.064832: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cusparse64_11.dll
2021-04-19 03:22:41.065202: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudnn64_8.dll
 

Однако, когда я запускаю среду, использующую среду Python, которая по сути является оболочкой для среды, написанной на C# с использованием Python.Net is получает ошибки библиотеки DLL Cuda не были найдены:

 2021-04-19 03:15:14.884746: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cublas64_11.dll'; dlerror: cublas64_11.dll not found
2021-04-19 03:15:14.885031: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cublasLt64_11.dll'; dlerror: cublasLt64_11.dll not found
2021-04-19 03:15:14.885281: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cufft64_10.dll'; dlerror: cufft64_10.dll not found
2021-04-19 03:15:14.885586: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'curand64_10.dll'; dlerror: curand64_10.dll not found
2021-04-19 03:15:14.885851: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cusolver64_10.dll'; dlerror: cusolver64_10.dll not found
2021-04-19 03:15:14.886174: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cusparse64_11.dll'; dlerror: cusparse64_11.dll not found
2021-04-19 03:15:14.886454: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'cudnn64_8.dll'; dlerror: cudnn64_8.dll not found
 

Минимальный код для воспроизведения проблемы:

 
import tensorflow as tf
from TicTacToeSharpEnvironmentWrapper import TicTacToeEnvironment
env = TicTacToeEnvironment()
physical_devices = tf.config.list_physical_devices('GPU')

 

С TicTacToeSharpEnvironmentWrapper.py

 import tensorflow as tf
from tf_agents.environments import py_environment
from tf_agents.specs import BoundedArraySpec
from tf_agents.trajectories.time_step import StepType
from tf_agents.trajectories.time_step import TimeStep
import numpy as np

assembly_path1 = r"C:DesktopGymbinDebug"
import sys

sys.path.append(assembly_path1)
import clr
clr.AddReference("GymSharp")
from GymSharp import TicTacToeSharpEnvironment

"""A CSharp environment for Tic-Tac-Toe game."""
class TicTacToeEnvironment(py_environment.PyEnvironment):
  """A state-settable environment for Tic-Tac-Toe game.
  """

def __init__(self):
     super(TicTacToeEnvironment, self).__init__()
     self.sharp_env = TicTacToeSharpEnvironment()   
 

TicTacToeSharpEnvironment-это библиотека класса c#, скомпилированная в виде 64-битной библиотеки dll

 public class TicTacToeSharpEnvironment
{
    static TicTacToeSharpEnvironment()
    {
        PythonInitiliazer.InitializePython();
    }
}    
 

And PythonInitiliazer is used to initalize Python.Net

 public class PythonInitiliazer
{
    static PythonInitiliazer()
    {
        InitializePython();
    }
    static bool initialized;
    public static void InitializePython()
    {
        if (!initialized)
        {
            initPython();
            initialized = true;
        }
    }
    private static void initPython()
    {

        string pathToVirtualEnv = @"C:Program Files (x86)Microsoft Visual StudioSharedPython37_64";

        Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process);
        Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}\Lib\site-packages;{pathToVirtualEnv}\Lib;{pathToVirtualEnv}\scripts", EnvironmentVariableTarget.Process);
        Runtime.PythonDLL = "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python37.dll";

        PythonEngine.PythonHome = pathToVirtualEnv;
        PythonEngine.PythonPath = Environment.GetEnvironmentVariable("PYTHONPATH", EnvironmentVariableTarget.Process);
        PythonEngine.Initialize();
    }
}    
 

Полный код работает. Оболочка Python среды C# проходит модульные тесты агентов Tensorflow для среды Tic Tac Toe. Среда C# может быть обернута как среда Python или среда тензорного потока, и различные агенты могут обучаться в этой среде.

Я не думаю, что это проблема совместимости с использованием x64 .Net DLL, потому что я использую 64-разрядный python, но я не могу быть уверен.

Дополнительные сведения:

  1. GeForce RTX 3080 (вычислительная способность: 8,6)
  2. Windows 10 20 ЧАСОВ 2
  3. Net Framework 4.8 (скомпилирован с помощью Visual Studio 2019)
  4. Python 3.7 (64-разрядный)
  5. Nvidia CUDA 11.
  6. Tensforflow-графический процессор 2.4.1
  7. Tf-Агенты 0.7.1
  8. pythonnet 3.0.0-предварительный просмотр2021-04-03

Что еще может быть причиной этой проблемы?

Ответ №1:

Я решил эту проблему. Это было из-за плохого Питона.Сетевая вики — документация, показывающая, как использовать Python.Сеть в виртуальной среде.

Исправление для других, сталкивающихся с этой или очень похожей проблемой, заключается в том, чтобы не использовать код в Вики:

 var pathToVirtualEnv = @"pathtoenv";

Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process);
 

Это приведет к перезаписи вашей PATH переменной среды.

Вместо этого добавьте путь к виртуальной среде python в существующую PATH переменную среды.

Вместо этого добавьте путь к виртуальной PATH среде в переменную среды.

 string pathToVirtualEnv = @"pathtoenv";

var path = Environment.GetEnvironmentVariable("PATH");
Environment.SetEnvironmentVariable("PATH", path   ";"   pathToVirtualEnv, EnvironmentVariableTarget.Process);