2019년 6월 19일 수요일

Ubuntu 18.04 + CUDA 9.2에서 nvidia-smi가 UNKNOWN ERROR를 보일 때 해결 방법


현재 최신 CUDA는 10.1이고, 10.0을 쓰기 시작한지도 꽤 되었습니다만, 여전히 Ubuntu 18.04 ppc64le 환경에서 CUDA 9.2를 설치해야 하는 경우가 있습니다.

NVIDIA 홈페이지에서 CUDA 9.2를 download 받아보면 이건 Ubuntu 16.04에서 지원된다고 되어 있습니다만, 실제로 설치해보면 Ubuntu 18.04에서도 문제없이 잘 설치됩니다.

그런데, 생각하지 않은 문제가 발생하는 경우가 있습니다.   정상적으로 CUDA 9.2가 설치되었고 nvidia-persistenced도 제대로 구동되고 있는데, 아래와 같이 nvidia-smi에서 UNKNOWN ERROR가 뜨는 것입니다.

$ nvidia-smi
Wed Jun 19 21:13:35 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000004:04:00.0 Off |                    0 |
| N/A   37C    P0    39W / 300W |        UNKNOWN ERROR |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  On   | 00000004:05:00.0 Off |                    0 |
| N/A   39C    P0    39W / 300W |        UNKNOWN ERROR |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-SXM2...  On   | 00000035:03:00.0 Off |                    0 |
| N/A   35C    P0    38W / 300W |        UNKNOWN ERROR |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-SXM2...  On   | 00000035:04:00.0 Off |                    0 |
| N/A   40C    P0    38W / 300W |        UNKNOWN ERROR |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


이건 Ubuntu 16.04 위의 CUDA 9.2에서 nvidia-persistenced를 구동하던 방법이 (이유는 잘 모르겠으나) Ubuntu 18.04 위의 CUDA 9.2에서는 제대로 작동하지 않기 때문입니다.  해결책은 다음과 같이 /lib/systemd/system/nvidia-persistenced.service에서 nvidia-persistenced의 시작 옵션을 바꾸어 주시면 됩니다.


$ sudo vi /lib/systemd/system/nvidia-persistenced.service
...
#ExecStart=/usr/bin/nvidia-persistenced --user root --no-persistence-mode --verbose
ExecStart=/usr/bin/nvidia-persistenced --verbose
...


이렇게 한 뒤 nvidia-persistenced를 restart 하고 다시 nvidia-smi를 해보시면 아래와 같이 잘 되는 것을 보실 수 있습니다.

$ nvidia-smi
Wed Jun 19 21:21:13 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000004:04:00.0 Off |                    0 |
| N/A   37C    P0    39W / 300W |      0MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  On   | 00000004:05:00.0 Off |                    0 |
| N/A   39C    P0    39W / 300W |      0MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-SXM2...  On   | 00000035:03:00.0 Off |                    0 |
| N/A   35C    P0    38W / 300W |      0MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-SXM2...  On   | 00000035:04:00.0 Off |                    0 |
| N/A   40C    P0    38W / 300W |      0MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+





2019년 6월 14일 금요일

H2O Driverless AI의 NLP (자연어처리) demo


H2O Driverless AI의 최신 버전에서는 자연어처리(NLP, Natural Language Processing) 기능도 제공합니다.  Expert tab을 눌러 보면 tensorflow를 사용할 수 있게 되어있지요.  이번 posting에서는 H2O Driverless AI의 자연어처리를 이용한 예측 모델을 만들어보겠습니다.

먼저, dataset은 아래에서 제공하는 항공사 고객 만족도 data를 사용했습니다.  이 csv 표에는 여러가지 column이 난잡하게 들어가 있는데, 여기서는 airline_sentiment라는 column의 'positive'냐 'negative'냐라는 값을 예측해 보겠습니다.  이를 위해 사용되는 column은 딱 하나, text라는 column입니다.  이는 이 항공사를 사용한 고객이 올린 tweeter의 문장입니다.  나머지는 다 불필요한 column로서 출발일자, 출발지 등등의 data입니다.

Dataset은 다음과 같이 download 받을 수 있습니다.

root@63e8f0c0eac9:/home# wget https://www.figure-eight.com/wp-content/uploads/2016/03/Airline-Sentiment-2-w-AA.csv

이 dataset 중에서 10%를 test data로 떼어내겠습니다.  이를 위해서는 아래의 간단한 python code를 이용합니다.

root@63e8f0c0eac9:/home# vi split_sentiment.py
import numpy as np
import pandas as pd
from sklearn import model_selection
al = pd.read_csv("Airline-Sentiment-2-w-AA.csv", encoding='ISO-8859-1')
train_al, test_al = model_selection.train_test_split(al, test_size=0.1, random_state=2018)
train_al.to_csv("train_airline_sentiment.csv", index=False)
test_al.to_csv("test_airline_sentiment.csv", index=False)

이를 아래와 같이 수행하면 9대1로 나누어진 train 및 test csv 파일이 각각 생성됩니다.

root@63e8f0c0eac9:/home# python split_sentiment.py

root@63e8f0c0eac9:/home# ls -ltr *.csv
-rw-r--r-- 1 root root 3704908 Apr 26  2018 Airline-Sentiment-2-w-AA.csv
-rw-r--r-- 1 root root 3368890 Jun 14 02:43 train_airline_sentiment.csv
-rw-r--r-- 1 root root  376891 Jun 14 02:43 test_airline_sentiment.csv

root@63e8f0c0eac9:/home# wc -l *.csv
    232 Airline-Sentiment-2-w-AA.csv
   1486 test_airline_sentiment.csv
  13388 train_airline_sentiment.csv
  15106 total


이 중 train_airline_sentiment.csv의 구조를 살짝 보겠습니다.  Header 포함해서 딱 2줄만 보시지요.  여기서의 text는 @USAirways this is crazy. Haven't spoken to a human yet. There has to be a better way. http://t.co/mEOAlCIPdD 인데, 이런 tweet을 남긴 고객의 평가는 당연히 negative였습니다.

root@63e8f0c0eac9:/home# head -n 2 train_airline_sentiment.csv
_unit_id,_golden,_unit_state,_trusted_judgments,_last_judgment_at,airline_sentiment,airline_sentiment:confidence,negativereason,negativereason:confidence,airline,airline_sentiment_gold,name,negativereason_gold,retweet_count,text,tweet_coord,tweet_created,tweet_id,tweet_location,user_timezone
681462771,False,finalized,3,2/25/15 3:38,negative,1.0,Customer Service Issue,1.0,US Airways,,djxsv,,0,@USAirways this is crazy. Haven't spoken to a human yet. There has to be a better way. http://t.co/mEOAlCIPdD,,2/18/15 8:27,5.68084e+17,"Charlottesville, VA.",Eastern Time (US & Canada)


그에 비해 test_airline_sentiment.csv의 (header 제외하고) 첫줄을 보면, 이 고객이 남긴 tweet 문장은 @USAirways We did. @AmericanAir said to open one with you, too. 인데 평가는 negative였습니다.  이것만 보면 tweet 문장과 postive/negative의 관계가 이해는 가지 않는군요.

root@63e8f0c0eac9:/home# head -n 2 test_airline_sentiment.csv
_unit_id,_golden,_unit_state,_trusted_judgments,_last_judgment_at,airline_sentiment,airline_sentiment:confidence,negativereason,negativereason:confidence,airline,airline_sentiment_gold,name,negativereason_gold,retweet_count,text,tweet_coord,tweet_created,tweet_id,tweet_location,user_timezone
681461790,False,finalized,3,2/25/15 1:47,negative,1.0,Lost Luggage,1.0,US Airways,,LindsaySweeting,,0,"@USAirways We did. @AmericanAir said to open one with you, too.",,2/21/15 13:32,5.69248e+17,"Asheville, NC",Central Time (US & Canada)


아무튼 이 dataset을 H2O Driverless AI에 다음과 같이 올립니다. 



올리고나서 training dataset의 'Details' 항목을 보면 다음과 같이 각 column들의 구조와 맨 위의 20줄 값을 볼 수 있습니다.   아래 화면은 우리가 training의 대상으로 삼을 text column에 cursor를 올려 놓은 화면입니다.



이제 predict 메뉴를 이용해서 training에 들어갑니다.



예측하고자 하는 대상인 Target column은 당연히 'airline_sentiment' column을 택하면 됩니다.




그리고 이번에는 'text' column 외에는 모두 필요없으므로 상단의 'Drop columns...' 메뉴에서 'text' 이외의 모든 column을 선택합니다.




이번 training에서는 NLP를 위해 tensorflow를 사용하므로, Expert Tab에서 tensorflow를 ON 시켜줍니다. 




그리고 dial을 8(Accuracy)-5(Time)-8(Interpretation)에 놓고 'Launch Experiment' 버튼을 눌러 training을 시작합니다.



칼럼이 딱 하나, 'text' 뿐이므로 기본 feature는 1개 뿐이지만, training이 진행되면서 H2O DAI의 자랑인 auto feature engineering에 의해 feature 수는 점점 늘어납니다.  21% 진행시에는 76개 feature에 대해 2188개의 model을 train 중이고, 45% 진행시에는 247개 feature, 90% 진행시에는 818개 feature에 대해 train 중인 것을 보실 수 있습니다.





Training이 끝나면 다음과 같이 'Score on another dataset'을 눌러 아까 준비해둔 test dataset을 선택합니다.




Download prediction을 하면 이 dataset에 대한 'airline_sentiment' column의 예측치를 보실 수 있습니다.

쉽게 비교를 해보기 위해서는 'Diagnose Model on New Dataset' 메뉴를 사용하셔도 됩니다.  여기서도 아까 준비해둔 test dataset을 선택하면 되는데, 그러면 GINI, MCC 등 각종 scoring 기준에 따른 정확도가 평가되어 나올 뿐만 아니라 오른쪽 상단의 'Download predictions' 버튼을 누르면 예측치와 함께 test dataset 속의 실제값도 함께 나와 비교하기 좋습니다.






이 예측치는 negative, neutral, positive의 3개 값에 대한 classification이므로 각 값일 확률이 세개의 column에 나오고, 네번째 column에는 test dataset 속의 실제값이 제시되는 것입니다.   이대로는 한눈에 보기 어려우니, 간단한 excel 함수 IFS와 countif 등을 써서 아래와 같이 정리했습니다.



즉, 제대로 맟춘 것은 1464개 중 1160개로서, 적중률은 79% 입니다.  이 정도면 매우 훌륭합니다.

Accuracy-Time-Interpretability의 dial을 10-10-4로 높여보면 어떨까요 ?  일단 생성되는 feature들과 model들의 수가 확 늘어납니다.



그리고 당연히 그 정확도도 향상됩니다.  이번에는 83%까지 나오네요.  Dataset이 더 커지면 그 정확도도 더 늘어날 것으로 예상할 수 있습니다.




단, 이렇게 NLP를 사용한 예측 모델을 만들 때는 H2O DAI의 또다른 자랑거리인 XAI (혹은 MLI, 즉 eXplainable AI)는 제대로 사용하실 수가 없습니다.   'Interpret this model'을 눌러보면 다음과 같은 error가 나오는데, 충분히 이해가 가는 일이지요.

Model interpretation failed.
Traceback (most recent call last):
  File "/root/dai-1.6.2-linux-ppc64le/python/lib/python3.6/site-packages/h2oai/procedures.py", line 3297, in do_mli_api
    dt_tree_depth, config_overrides, logger=logger, id_columns=id_columns)
  File "h2oaicore/mli.py", line 807, in h2oaicore.mli.do_mli
  File "h2oaicore/mli.py", line 1485, in h2oaicore.mli.input_check
h2oaicore.systemutils.InvalidDataError: All input columns are of type string and have cardinality > max allowed(25), which is currently not useful for MLI