Antlr: Самый Простой способ распознать даты и числа?

Чтобы подвести итог нашего разговора в соответствии с комментариями, я не верю, что вы можете выделить память 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 гигабайт +).
В заключение выясните, что потребляет всю память вашей видеокарты, и завершите эту задачу. Я верю, что это решит вашу проблему.

5
задан noah 26 September 2008 в 20:46
поделиться

1 ответ

Проблема состоит в том, что Вы, кажется, хотите выполнить и синтаксическую и семантическую регистрацию в Вашем лексическом анализаторе и/или Вашем синтаксическом анализаторе. Это - частая ошибка и что-то, что только возможно на очень простых языках.

То, что действительно необходимо сделать, принимают более широко в лексическом анализаторе и синтаксическом анализаторе, и затем выполняют семантические проверки. То, насколько строгий Вы находитесь в своем 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 */)}

Когда Вы делаете это, однако, Вы встраиваете язык определенный код в Вашу грамматику, и это не будет портативно через цели.

5
ответ дан 14 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: