#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, но я не могу быть уверен.
Дополнительные сведения:
- GeForce RTX 3080 (вычислительная способность: 8,6)
- Windows 10 20 ЧАСОВ 2
- Net Framework 4.8 (скомпилирован с помощью Visual Studio 2019)
- Python 3.7 (64-разрядный)
- Nvidia CUDA 11.
- Tensforflow-графический процессор 2.4.1
- Tf-Агенты 0.7.1
- 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);