태그 보관물: python

jupyter server 보안 설정하기

Published / by greennuri

jupyter Notebook 서버를 올렸는 아무나 접근하게 하고 싶지 않을때 다음과 같이 설정한다.

jupyter notebook --generate-config
위 코드를 실행 시키면
/home/jupyter/.jupyter/jupyter_notebook_config.py 파일이 생긴다.
위 파일에서 아래와 같은 항목을 아래와 같이 설정한다.

c.NotebookApp.ip = '0.0.0.0'
위 코드는 외부 접속이 가능하게 허용하는 설정

c.NotebookApp.port = 8888
위 코드는 접속 포트 설정, 방화벽이나 기타 이유로 바꿔야 할시 위 값을 바꾸면 됨.

c.NotebookApp.open_browser = False
위 코드는 주피터를 실행할때 브라우저를 열지 않게 하는 설정
c.NotebookApp.notebook_dir = "/path/to/ipython"
위 코드는 주피터 작업 디렉토리를 설정
c.NotebookApp.password = u'password'
위 코드는 주피터 접속시 암호를 입력받게 하는 설정, 당연히 설정된 암호와 맞아야 ^^

c.NotebookApp.keyfile = '/home/jupyter/.ssh/mykey.key'
c.NotebookApp.certfile = '/home/jupyter/.ssh/mycert.pem'
위 두개 코드는 ssl 설정에서 나온 암호파일로 이 설정이 셋팅 되면
http://ip:8888이 아니고 https://ip:8888로 접속해야 한다.

openssl로 암호화 설정은 다음과 같이 수행
$openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

위 명령을 배쉬 쉘에서 실행하면 365일 동안 쓸수 있는 인증서 생성

jupyter ubuntu linux daemon으로 설정하기

Published / by greennuri

ubuntu에서 jupyter daemon으로 설정하기

다음과 같은 방식으로 서비스 설정 파일을 작성한다.

위치 : /etc/systemd/system/
파일명 : ipython-notebook.service

내용

  • Unit
  • type=simple
  • PIDFile=/var/run/ipython-notebook.pid
  • ExecStart=/usr/bin/ipython notebook –no-brower
  • User=ipynb
  • Group=ipynb
  • WorkingDirectory=/home/ipynb/notebooks
  • Install
  • WantedBy=multi-user.target

위의 설정 파일에서는 서비스를 돌리는 계정과 그룹을 ipynb로 정의 하고 있다. 그러므로 계정을 추가 해야 한다

  • useradd ipynb
  • su – ipynb
    cd $IPYNB HOME ipynb로 계정 전환후 ipython 홈 디렉토리로 이동한다.
    systemctl daemon-reload
    systemctl enable ipython-notebook
    systemctl start ipython-notebook

위와 같이 설정하면 동작하는데 다음과 같은 오류가 발생할수 있다.
OSError: [Errno 13] Permission denied: '/run/user/1000/jupyter'

외와 같은 오류가 발생시 XDG_RUNTIME_DIR 값을 설정해재 하면 처리 됨. 관련 깃허브 이슈

그외에 다른 링크 공유

pyspark와 zeppelin 연동하기

Published / by greennuri

분산 처리 플랫폼 중 하나인 스파크(spark)를 제플린(apache zeppelin, 웹 개발 플랫폼 아님)) 연동 시키기 위한 삽질을 정리

제플린을 기준으로 스파크 설정

현재 제플린은 https://zeppelin.apache.org/download.html 홈페이지에서 다운 받을수 있으며 버젼은 0.7.3(2018.5.7일 현재)이며
이 버젼은 스카프 2.1, 2.2까지 지원한다.

스파크는 https://spark.apache.org/downloads.html 링크에서 다운 받을수 있으며 최신 버젼은 2.3.0까지 나와 있지만, 제플린과 연동을 위해서는 2.1.0을 추천(2.2버젼도 지원 된다고 하지만 좀 애매해서 한 버젼 낮은걸 사용)

그리고 spark 2.1.0 버젼은 python 3.6 버젼에서 호환성 문제(오류가 생김… 오류 생기니깐 호환이 안 맞는거 맞지 않을까…)

그래서 spark 2.1.0 설정에서 PYTHON_PATH에 python 3.5 버젼 python 파일을 설정해야 함.

아래 링크에서는 spark 2.1.0에서 python 3.6에서 사용하기 위한 픽스를 설명

http://www.blog.howechen.com/fix-compatibility-of-apache-spark-2-1-0-with-python-3-6/

그냥 아나콘다에서 python3.5 환경 추가 시켜서 PYTHON_PATH에 할당하고 사용함..

귀차니즘… ^^

pycharm으로 원격 디버깅 하기

Published / by greennuri

https://www.jetbrains.com/help/pycharm/remote-debugging.html

https://www.jetbrains.com/help/pycharm/remote-debugging-with-pycharm.html#remote-interpreter

jetbrain의 pycharm은 여러가지 기능이 많은데 그중에

최근에 알게된 원격 디버깅을 잠시 소개

이 기능은 쓰고 있는 컴퓨터의 파이썬이 아니라

원격지에 있는 (아마 주로 서버) 파이선을 이용해서 디버깅을 수행 할 수 있게 해주는 기능이다.

상용 방법은 간단하다

prefenrence -> project -> project interpreter에서
project interpreter에서 원격지에 있는 인터프리터를 설정 하면되는데

이 설정과 ssh tunneling을 활용하면 상당히 편리하다

나중에 좀더 고칠 예정..

우분투 새로 설치하고 tensorflow 설치하기

Published / by greennuri

기계학습용으로 우분투를 새로 설치하고 tensorflow 설치 하는 과정

차후에 사용하기 위한 내용 요약

이곳에서 우분투를 다운로드

왠만하면 LTS 버젼으로 다운로드 받고, 경우에 따라서 Server나 Desktop 버젼을 다운로드한다.
Server버젼은 Desktop 그러니깐  UI가 없는 버젼. 
Desktop이 설치되어 있더라도 로컬에서 데스크탑으로 쓰지 않으면 그래픽 메모리 손실은 발생하지 않는듯. 

부팅 이미지 만들기

참조 링크

간략 정리
1. iso 이미지를 맥용 이미지로 변환 
    ./hdiutil convert -format UDRW -o ~/desktop/ubuntu.img ~/desktop/download.iso

2. usb를 언마운트
    diskutil unmountDisk /dev/disk[번호]

3. usb에 저장 이미지 업로드 
    sudo dd if=~/desktop/ubuntu.img of=/dev/disk[번호] bs=1m

nvidia 그래픽 드라이브 설치

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-last

위 절차대로 제대로 깔리면 nvidia-smi 명령어를 실행 시키면 그래픽 카드 종류와 메모리 용량이 표시 됨

리눅스에 개발환경 설치

sudo apt-get install 'Development Tools'
sudo apt-get install python-dev
sudo apt-get install git # git 

anacoda 설치

    우분투에 python이 이미 있는데도 anaconda를 설치 하는 이유는 시스템에 영향을 줘서 시스템이 망가지는것을 방지 하기 위해서...
    anaconda는 이곳에서 (다운로드)]https://www.anaconda.com/download/#macos
    anaconda 설치후 가상 환경 만들기 
    conda create --name $ENVIROMENT_NMAE $PREINSTALL_PACKAGES 
    $ENVIROMENT_NAME : 가상환경 이름 
    $PREINSTALL_PACKAGES : 기본 설치할 패키지명 
    
    conda create --name tf tensorflow-gpu 
    위와 같이 입력 하면 tf라는 이름의 가상환경이 만들어지고 기본으로 tensorflow-gpu가 설치됨. 
    
    conda 가상 환경을 쓰면 좋은 점 [링크](https://graspthegist.com/post/learn-conda-1/)
    

필수 패키지 설치

    필수 패키지를 설치 하기전 가상 환경으로 진입.
    source activate $ENVIROMENT_NAME
    conda install opencv #opencv 설치 
    conda install nltk #nltk 설치
    그외 여러 패키지 설치 

원문

scikit으로 mnist나 iris 같은 데이터를 지도 학습 시킨다고 할때

어떠한 지도학습 모델에 적용 시키느냐에 따라서 성능(acc)이 차이가 나지만,

동일한 지도학습 모델에서도 파라메터 최적화 여부에 따라서 성능이 더 좋아 지기도 합니다.

여기서는 scikit-learn에서 제공하는 grid_search를 통해 학습 모델 최적화에 대해서 얘기 합니다.

from __future__ import print_function

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

print(__doc__)

# Loading the Digits dataset
digits = datasets.load_digits()

# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target

# Split the dataset in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

# Note the problem is too easy: the hyperparameter plateau is too flat and the
# output model is the same for precision and recall with ties in quality.

위 예제는 원문에 있는 코드를 그대로 가져 왔습니다

예제 코드에서는 svm을 최적화 하는 예제

보통 일반적으로 학습을 하려 하면 다음과 같이 수행.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)
#학습 및 평가 데이터셋 분리 
clf = SVC()
clf.fit(X_train, y_train)
#위 코드를 실행 시키면 주어진 데이터에서 알아서 학습을 수행

위 코드에서 나오는 정확도(acc)는 svc 모델의 초기값을 기반으로 나온 정확도

이걸 grid_search를 통해 다음과 같이 최적화 시킴

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

tunes_parameters 변수에 해당 모델(여기서는 svc)에서 최적화 시킬 파라메터를 정의 한다.

scores 변수에는 precision, recall 어느 지수를 기준으로 최적화 할지를 지정한것.

위 코드를 수행 하면 precision 기준 최적화 한 셋트(tunes_parameters에 나온 파라메터를 다 대입해서 수행)와 recall 기준 최적화 한 셋트를 수행

grid_search는 위의 그림 중 왼쪽에 해당, 모델을 이루고 있는 하이퍼 파라메터를 그림과 같이 그리드를 구성하고 각각 지점에서 성능을 측정한다.

그리고 scikit_learn에서 최적화 알고리즘중 하나인 random_search는 위 그림 중 오른쪽에 나타난데로, 하이퍼파라메터들을 랜덤하게 골라서 최적화를 수행한다.