Чтобы подвести итог нашего разговора в соответствии с комментариями, я не верю, что вы можете выделить память GPU или память рабочего стола для GPU - не так, как вы пытаетесь. Когда у вас один графический процессор, в большинстве случаев Tensorflow-GPU выделяет около 95% доступной памяти для выполняемой задачи. В вашем случае, что-то уже использует всю доступную память GPU, что является основной причиной, по которой ваша программа не запускается. Вам необходимо проанализировать использование памяти вашего графического процессора и освободить часть памяти (я не могу не думать, что у вас уже есть другой экземпляр Python, использующий графический процессор Tensorflow, работающий в фоновом режиме или какую-то другую интенсивную программу графического процессора). В Linux команда nvidia-smi
в командной строке скажет вам, что использует ваш графический процессор, вот пример
Sun Jan 20 18:23:35 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130 Driver Version: 384.130 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 970 Off | 00000000:01:00.0 Off | N/A |
| 32% 63C P2 69W / 163W | 3823MiB / 4035MiB | 40% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 3019 C ...e/scarter/anaconda3/envs/tf1/bin/python 3812MiB |
+-----------------------------------------------------------------------------+
В моем случае вы можете видеть, что моя карта на моем сервере имеет 4035 МБ или ОЗУ, 3823 МБ используется. Более того, просмотрите процесс графического процессора в нижней части. Процесс PID 3019 потребляет 3812 МБ из доступных 4035 МБ на карте. Если мы хотели запустить другой скрипт на python с использованием tenorflow, у меня есть два основных варианта: я могу либо установить второй GPU и запустить на втором GPU, либо, если GPU не доступен, затем запустить на CPU. Кто-то более опытный, чем я, может сказать, что вы могли бы выделить только половину памяти для каждой задачи, но 2 гигабайта памяти уже достаточно мало для тренировки тензорного потока. Обычно для этой задачи рекомендуется использовать карты с большим количеством памяти (6 гигабайт +).
В заключение выясните, что потребляет всю память вашей видеокарты, и завершите эту задачу. Я верю, что это решит вашу проблему.
Проблема состоит в том, что Вы, кажется, хотите выполнить и синтаксическую и семантическую регистрацию в Вашем лексическом анализаторе и/или Вашем синтаксическом анализаторе. Это - частая ошибка и что-то, что только возможно на очень простых языках.
То, что действительно необходимо сделать, принимают более широко в лексическом анализаторе и синтаксическом анализаторе, и затем выполняют семантические проверки. То, насколько строгий Вы находитесь в своем lexing, ваше дело, но у Вас есть две основных опции, в зависимости от того, необходимо ли принять, обнуляет предшествование дням месяца: 1) Действительно примите для своего INTs, 2) определите DATENUM, чтобы только принять те маркеры, которые являются допустимыми днями, все же не допустимый INTs. Я рекомендую второе, потому что будет меньше семантических проверок, необходимых позже в коде (так как INTs будет затем поддаваться проверке на уровне синтаксиса, и необходимо будет только выполнить семантические проверки в даты. Первый подход:
INT: '0'..'9'+;
Второй подход:
DATENUM: '0' '1'..'9';
INT: '0' | SIGN? '1'..'9' '0'..'9'*;
После принятия использования этих правил в лексическом анализаторе Ваше поле даты было бы также:
date: INT '/' INT ( '/' INT )?
или:
date: (INT | DATENUM) '/' (INT | DATENUM) ('/' (INT | DATENUM) )?
После этого Вы выполнили бы, семантическое работает на основе Вашего AST, чтобы удостовериться, что Ваши даты допустимы.
Если Вы - тупик при выполнении семантических регистраций Вашей грамматики, однако, ANTLR позволяет семантические предикаты в синтаксическом анализаторе, таким образом, Вы могли сделать поле даты, которое проверяет значения как это:
date: month=INT '/' day=INT ( year='/' INT )? { year==null ? (/* First check /*) : (/* Second check */)}
Когда Вы делаете это, однако, Вы встраиваете язык определенный код в Вашу грамматику, и это не будет портативно через цели.