2023년 10월 15일 일요일

ros2 설치 및 활용

https://www.robotstory.co.kr/king/?board_page=4&vid=874 참고하여 요약함


1. 설치 (humble 기준)

ROS2 Ardent == Ubuntu 16.04

ROS2 Dashing == Ubuntu 16.04, 18.04

ROS2 Foxy == Ubuntu 20.04

ROS2 Rolling / Humble / Iron /  == Ubuntu 22.04


아래 따라하기

https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

https://docs.ros.org/en/humble/Installation.html


2. 활용 (humble 기준)

2.1 환경 설정 (새로운 terminal 열면 해야 함)

# source the setup files
source /opt/ros/humble/setup.bash

# check env. var. (ROS_DISTRO, ROS_DOMAIN_ID, ROS_VERSION 확인가능)
printenv | grep -i ROS

 

# set ROS_DOMAIN_ID (default 0)
같은 DOMAIN상의 노드들끼리만 잘 보이고, 메시지 전송이 가능함
export ROS_DOMAIN_ID=<your_domain_id>

# limit to localhost only (cannot communicate w/ other coms)
export ROS_LOCALHOST_ONLY=1
 

(option. 다음 설정을 하면 매번 안해도 됨)

# All setups in bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "export ROS_DOMAIN_ID=<your_domain_id>" >> ~/.bashrc
echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc

 

2.2 이해 (node, topic, service, action)

# node: 단일 기능 객체 (ex: 바퀴제어, 이미지센서수집), 다른 노드와 데이터를 topics, services, action, param 형태로 주고 받을 수 있음

ros2 node list
ros2 node info
# topic: publisher-subscriber 형태 (Youtube/뉴스처럼 한명이 올리고, 다수가 받아보는 형태)의 메시지 전달 방법
ros2 topic list
ros2 topic list -t (w/ type)
ros2 interface show <msg> (see msg type)
ros2 topic echo <topic_name> (see topic contents)
ros2 topic pub <topic_name> <msg_type> '<args>' (실제 topic을 cmd로 뿌리기)

# call-and-respose 형태의 메시지 전달 방법 (client의 요청이 있을 때만 답함)
ros2 service list -t (w/ type)
ros2 service type <service_name>
ros2 service find <type_name>
ros2 interface show <type_name>.srv
ros2 service call <service_name> <service_type> <arguments>

# params: node setting argument
ros2 param list
ros2 param get <node_name> <parameter_name>
ros2 param set <node_name> <parameter_name> <value>
ros2 param dump <node_name> (params to file <node_name>.yaml)
ros2 param load <node_name> <parameter_file>

# action은 긴 시간동안 동작하도록 설계된 communication type
# goal, feedback, result로 구성됨
# goal 설정, 결과는 service형태로, feedback은 topic형태로 구성
# 기본적으로 동작은 client-server형태
ros2 action list
ros2 action info /turtle1/rotate_absolute
ros2 interface show turtlesim/action/RotateAbsolute
ros2 action send_goal <action_name> <action_type> <values>

# messages: topic의 실질적 정의된 형태 (A topic은 A msg현태로, B topic은 B msg 형태로)

# to view logs
rqt_console

# install turtlebot and rqt
sudo apt update
sudo apt install ros-foxy-turtlesim
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

sudo apt install ~nros-foxy-rqt*
rqt
rqt_graph

# topic을 선택해서 기록할 수 있음
ros2 bag record <topic_name> <topic_name2> ...
ros2 bag play subset

######################################################
2.3 colcon: package 구현 툴
sudo apt install python3-colcon-common-extensions

underlay: ROS2설치 및 셋업에서 설정됨
overlay: 내가 목적을 가지고 짜는 프로그램

source /opt/ros/humble/setup.bash
colcon build --symlink-install
# if meet error
conda install -c conda-forge catkin_pkg empy lark
# if meet error again
delete cpp src in src code

echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
colcon_cd  (pkg간 폴더이동)

tab으로 완성하기
echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc


#######################################
2.4 workspace 만들기 (프로젝트 같은)
source /opt/ros/humble/setup.bash

ros2_ws가 workspace이름임.

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# copy from github for sample code
git clone https://github.com/ros/ros_tutorials.git -b humble

# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro humble -y

colcon build

open new terminal
# <underlay>
source /opt/ros/humble/setup.bash
# <overlay>
cd ~/ros2_<ws_name>
source install/local_setup.bash

#############################
2.5 package 만들기  (모듈 같은)
구성
package.xml (패키지 메타 정보)
resource/<pkg_name>
setup.cfg (실행파일일 경우 필요, ros2 run <>)
setup.py (설치파일)
<pkg_name> (ros2용 검색 폴더)


cd ~/ros2_ws/src

ros2 pkg create --build-type ament_python <package_name>
ros2 pkg create --build-type ament_python --node-name my_node my_package

cd ~/ros2_ws
colcon build
colcon build --packages-select my_package

colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release # Relese모드로 빌드

source install/local_setup.bash

ros2 run my_package my_node

# fill the TODO information in package.xml and setup.py


######################################################
2.6 node for publisher and subscriber

2.6.1 create package
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python py_pubsub

2.6.2 make node by getting toy python code
cd ros2_ws/src/py_pubsub/py_pubsub
wget https://raw.githubusercontent.com/ros2/examples/humble/rclpy/topics/minimal_publisher/examples_rclpy_minimal_publisher/publisher_member_function.py

2.6.3 add dependency at package.xml
<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>

2.6.4 add entry point at setup.py
entry_points={
        'console_scripts': [
                'talker = py_pubsub.publisher_member_function:main',
        ],
},

2.6.5 install related dependency
rosdep install -i --from-path src --rosdistro humble -y
# build
colcon build --packages-select py_pubsub

2.6.7 run
source /opt/ros/humble/setup.bash    # source underlay  (bash에 있음 안해도 됨)

source install/setup.bash        # source overlay

ros2 run py_pubsub talker

ros2 run py_pubsub listener
 

 
####################################################
2.7 cv_bridge 설치 (opencv - ros image 컨버터)

sudo apt-get install ros-(ROS version name)-cv-bridge

sudo apt-get install ros-(ROS version name)-vision-opencv

해보고 안되면 아래도 설치
sudo apt install python3-numpy
sudo apt install libboost-python-dev

 
cd <YOUR_ROS2_WORKSPACE>/src
git clone https://github.com/ros-perception/vision_opencv.git -b humble
cd ..
colcon build --symlink-install

sudo apt install python3-opencv

source <YOUR_ROS2_WORKSPACE>/install/local_setup.bash
colcon test

 

2023년 2월 15일 수요일

accuracy, f1 score, roc auc, pr auc

 

https://neptune.ai/blog/f1-score-accuracy-roc-auc-pr-auc


accuracy: 

- predicted class로 계산됨

- 문제가 well-balanced class 인 경우, 모든 class가 중요한 경우

f1 score: 

- predicted class로 계산됨

- positive class가 좀 더 중요한 binary class 문제

roc auc:

- predicted score로 계산됨

- score가 확률보다는 rank에 가까울 때

- heavily imbalanced class에서는 사용하면 안됨

- 모든 class가 중요한 경우

pr auc:

- predicted score로 계산됨

- heavily imbalanced class인 경우

- pos가 neg보다 중요한 경우

2022년 1월 6일 목요일

xrdp 설치

<참조: https://jangjy.tistory.com/293>

1. xrdp 설치 

(option)sudo apt-get update

sudo apt-get install xrdp

<option> sudo apt-get install xorgxrdp
sudo apt-get update
sudo apt-get install mate-core mate-desktop-environment mate-notification-daemon
sudo sed -i.bak '/fi/a #xrdp multiple users configuration \n mate-session \n' /etc/xrdp/startwm.sh

이제 윈도우즈 원격접속으로 접속 가능해짐.


2. 로그인 후, 검은 화면이 보인다면

gnome 대신 xfce를 띄우면 됨


2. 세션에 접속시 다르게 접속된다면

sudo gedit /etc/xrdp/xrdp.ini

[xrdp1]에서 마지막 줄 port=-1을

port=ask5910 

으로 수정 후, 서비스 재시작.

sudo service xrdp restart

재접속 시, port번호 입력장이 보임.

-1, 5910등 여러개를 입력하다보면 과거에 접속한 세션이 보임.

맨 처음 세션 생성시 -1을 입력하면 5910을 사용함. 이후, 5910을 계속 사용하면 됨.

2021년 10월 7일 목요일

이미지를 비디오로, 코덱을 바꾸고

이미지 시퀀스를 비디오로 바꾸는 경우,

 1. 알씨의 동영상 만들기 X: 1장당 재생시간이 1초 미만으로 내려가지 않음.

 2. python코드를 직접짜서 활용함

import cv2
import os

image_folder = 'path_to_images'
video_name = 'path_to_videos/output.wmv'
images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
images = sorted(images)
num_total_images = len(images)
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

fourcc = cv2.VideoWriter_fourcc(*'MP4V') # if mp4 codec is applied
fps = 5
frameSize = (width, height)
video = cv2.VideoWriter(video_name, fourcc, fps, frameSize)

for ith, image in enumerate(images):
video.write(cv2.imread(os.path.join(image_folder, image)))
print('%d / %d' % (ith, num_total_images))

cv2.destroyAllWindows()
video.release()


wmv를 압축 및 변환하자

 1. http://convert-video-online.com 활용


간단한 편집

 뱁믹스 활용

 - 개인용/상업용 모두 공짜

 - 일부 리소스는 유료



2021년 2월 1일 월요일

IEEE 제출 논문과 인터넷 공개 허용 정도

 <https://journals.ieeeauthorcenter.ieee.org/become-an-ieee-journal-author/publishing-ethics/guidelines-and-policies/post-publication-policies/>

 

IEEE에서는 논문의 진행상태에 따라 4가지 형태로 나누고 각 형태에 따라 공개가능 범위를 달리하고 있음.

 

논문은 진행 단계에 따라 다음과 같이 정의

- Preprint: IEEE 제출전 논문을 작성한 상태

- Author-submitted article: 처음 논문을 제출한 버전

- Accepted article: 리뷰/리바이즈 후, accept받은 버전

- Final published article: 최종 출판된 버전


저자가 공개가능한 범위

- Preprint: 저자의 개인 웹사이트, 소속 회사 웹사이트, arXiv, TechRxiv등 비영리 preprint서버 (단 accept도니 후에는 accepted버전으로 바꿔야 함)

- Author-submitted article: 저자의 개인 웹사이트, 소속 회사 웹사이트, 저자의 수업, SCNs

- Accepted article: 저자 개인 웹사이트, 소속 회사 웹사이트, arXiv, TechRxiv, Funder repository

(IEEE에 출판되면 위를 제외한 다른 모든 곳에서는 지워야 함)

- Final published article: 

  -- open access가 아닌 논문: 온라인에 올릴 수 없음. 단 개인적으로 주고받거나, IEEE허가하에 자신의 수업에 활용하거나, 학위 논문으로 사용은 가능함.

  -- open access license (CC BY)로 출판한 논문: 저자와 Funder는 공개, 공유, 사용을 상업용도를 포함하여 허락없이 사용가능함. 또한 저자가 저작권을 독자는 재사용권을 가짐 

  -- open access license (CCBY-NC-ND)로 출판한 논문: CC BY에서 상업용도를 제외하고 동일함.

2020년 8월 23일 일요일

Tyan서버 개발환경 설치

목록
- 1. Ubuntu server 설치 
- 2. xrdp를 이용한 win->linux 원격접속 연결
- 3. 그래픽드라이버 설치(NVIDIA) 384
- 4. CUDA, cudnn설치
- 5. pycharm, anaconda설치

1. Ubuntu server
1. ubuntu 사이트(https://ubuntu.com/download/server)에 서버버전 iso파일 다운로드하여 DVD에 굽기(16.04.3-server amd64 bit 사용함)
2. BIOS화면에서 F2/Del을 눌러 BIOS진입 -> 부팅순서를 DVD로 변경 후, 재부팅
3. ubuntu설치하기
  a. 언어는 English.
  b. network의 경우, enp13s0f0과 0f1이 있었는데, 0f0은 부팅용이라서 0f1을 LAN 케이블에 물리고 작업함.

  c. Hostname은 컴퓨터의 이름, User name은 사용자 이름이므로 주의해서 입력.
  d. Partition disk는 디스크를 지우고, auto로 할당함.
  e. 자동업데이트는 No automatic updates선택
  f. Server유형은 OpenSSH만 추가설치 (총 2개가 선택됨)
  g. 나머지는 모두 default값 사용함.
4. network 설정하기
  a. ifconfig -a로 네트워크 이름 확인(우리의 경우는 3.b.의 것 2개)
  b. sudo vi /etc/network/interfaces를 열고
    auto <네트워크이름>
    iface <네트워크이름> inet static
    address <IP주소입력>
    netmask <서브넷마스크>
    gateway <게이트웨이>
    dns-nameservers <DNS, 두개 이상은 공백으로, 주로 168.126.63.1 168.126.63.2 8.8.8.8 씀>
  c. /etc/init.d/networking restart 입력 후, 네트워크 적용안되면 reboot입력하여 재부팅
  d. ping 8.8.8.8로 동작확인
5. 프로그램 설치
  sudo apt-get update
  sudo apt-get install openssh-server

6. 원격접속용 컴퓨터에 putty설치(https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 후, IP넣고 접속.

2. xrdp를 이용하여 windows --> linux 원격접속 설치하기
 <참조: https://jangjy.tistory.com/293>

 <참조: https://yochin47.blogspot.com/2022/01/xrdp.html>


3. 그래픽드라이버 설치(NVIDIA) 384
<참고: https://hiseon.me/linux/ubuntu/install_nvidia_driver/>
1. 기존 NVIDIA 드라이버 삭제
 sudo apt-get purge nvidia*
2. 최신 그래픽 드라이버  버전 확인
 https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
 위 사이트에서 nvidia-graphics-drivers-*** 의 숫자 확인 (ctrl+f활용)
 http://www.nvidia.com/object/unix.html 에서 소유한 GPU가 위 버전 지원하는지 확인(해당버전 클릭 후, Supported Product tab누르면 됨.
  ex) TITAN Xp는 390가능. but 384사용
3. repository update
apt-get update && apt-get install -y dialog language-pack-en
export LANGUAGE=en_US
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
update-locale

sudo vi /etc/default/locale에
LANG="en_US.UTF-8"
LANGUAGE="en_US"
LC_ALL="en_US.UTF-8"

release="ubuntu"$(lsb_release -sr | sed -e "s/\.//g")
echo $release

sudo apt install sudo gnupg
sudo apt-key adv --fetch-keys "http://developer.download.nvidia.com/compute/cuda/repos/"$release"/x86_64/7fa2af80.pub"
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/'$release'/x86_64 /" > /etc/apt/sources.list.d/nvidia-cuda.list'
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/'$release'/x86_64 /" > /etc/apt/sources.list.d/nvidia-machine-learning.list'
sudo apt update

4. 그래픽카드 다운로드 및 설치
sudo apt-get install nvidia-384

Errors were encountered while processing:
 nvidia-384
 libcuda1-384
 nvidia-opencl-icd-384
E: Sub-process /usr/bin/dpkg returned an error code (1)

sudo mkdir /usr/lib/nvidia

sudo apt-get install dkms nvidia-modprobe

BIOS에러시
Secure Boot옵션 해제, Above 4G Decoding은 Enable

5. reboot 후, 버전 확인
  reboot 혹은 sudo reboot(putty로 원격 접속한 경우)
  lsmod | grep nvidia 혹은 lsmod | grep nouveau
  위 명령어로 뭐라도 뜨면 됨.
6. 그래픽 드라이버 자동 업데이트 방지
  sudo apt-mark hold nvidia-390



4. CUDA, CUDNN설치하기
https://www.blogger.com/blogger.g?blogID=8710166278779940585#editor/target=post;postID=3406118003326989536;onPublishedMenu=allposts;onClosedMenu=allposts;postNum=2;src=postname
 CUDA Toolkit 8.0 GA1 사용함.




4. firefox, pycharm, anaconda설치하기
 sudo add-apt-repository ppa:ubuntu-mozilla-security/ppa
 sudo apt-get install firefox

 anaconda 사이트에서 다운로드(2.7다운)
 chmod 744 파일명(Anaconda~~.sh)
 ./Anaconda~~.sh

  pycharm사이트에서 다운로드(Community버전)
  적당한 위치로 옮겨서 압축 출기
  sudo ln -s pycharm.sh /usr/bin  (symbolic link걸어서 아무데서 실행되도록)

5. conda 환경 복사
  conda activate ENV_NAME
  conda env export > ENV_NAME.yml
  conda env create -f ENV_NAME.yml

6. 

pip install opencv-contrib-python // install the most recent opencv


2020년 8월 13일 목요일

linux 온도 기록하기

문제: linux 구동시 주기적으로 시스템의 온도를 기록하자.

<참고: https://unix.stackexchange.com/questions/269858/does-linux-typically-log-system-temperature-data>


해결:
CPU
sensord -> 시스템온도와 voltage를 system log에 기록

sudo apt-get install lm-sensors
sudo sensors-detect
sudo service module-init-tools start
sudo service module-init-tools restart
sensors


HDD
hddtemp -> hard drive의 온도를 기록

sudo apt-get install hddtemp
sudo hddtemp /dev/sda /dev/sdb

but 둘다 수동으로 타이핑한 뒤부터 기록함.

GPU
nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU


주기적으로 수행 후, 기록하기(CPU, GPU만)
1. shell script만들기
logging_temp.sh

#!/bin/sh
date
sensors
nvidia-smi -q -d temperature | grep GPU | perl -pe '/^GPU/ && s/\n//' | grep ^GPU
echo ""

2. crontab에 등록하며 로깅설정하기
crontab -e
맨아래에 추가 (***** 빼면 안됨)

* * * * * logging_temp.sh >> /home/yochin/Desktop/log_temp.log 2>&1

3. crontab -l 로 확인하기

4. 만약에 permission denied라면?

chmod 744 loggin_temp.sh로 sh의 권한변경

ps -ef | grep cron 으로 pid확인 후, sudo kill -9 pid로 죽임


2020년 8월 2일 일요일

ImportError: ~/libstdc++.so.6: version 'GLIBCXX_3.4.22' not found

strings ~/libstdc++.so.6 | grep GLIBC
==> GLIBC관련 버전이 쭉 보임

내것은 3.4.21까지만 있었음. 즉 버전업을 해야됨.
sudo apt-get install libstdc++6
아마 이미 설치되어있을듯

sudo apt-get dist-upgrade
먼저 시도, 안되면 아래 모두 시도

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

* update는 이용가능한 버전을 조사, upgrade는 실제로 버전을 올림.



2019년 9월 5일 목요일

ms word와 mendeley로 쉽게 논문쓰기 팁

 
Mendeley를 이용한 reference 논문 참조하기
 - https://guides.lib.umich.edu/c.php?g=283073&p=1888264
 - 참조->Insert Citation->논문제목/저자 입력

Reference list에 논문이 중복되는 경우
1. mendeley에서 중복되는 논문들을 정리
 - https://researchguides.library.tufts.edu/c.php?g=249269&p=4031723
 - 왼쪽 All Documents를 누르고, Tools->Check for Duplicates를 선택
 - 나타난 중복에 대해서 클릭하면 중복되는 문서(pdf)들이 각각 열림
 - 중복된 열(문서가 여러개 있는 아이콘)을 누르면, 우측에 정보가 뜸. 여기서 체크박스가 없는 것은 충돌난 정보, 있는 것은 일치하는 정보임. 이를 해결 한 후, Confirm Merge를 누름.

2. reference업데이트하기
 - word에서 reference부분을 삭제 후, 참조->Insert Bibliography클릭
 - mendeley의 자료를 정리했기 때문에 삭제된 ref가 발생함.
 -DialogBox의 왼편은 삭제한 docu의 정보를 사용시, 오른쪽은 정리된 docu의 정보를 사용시 클릭. (리스트를 row별로 보고, 문제없다면 오른쪽 것을 사용하면 됨)


Figure/Table을 참조하기. cross-reference활용하기
-  먼저 Figure에서 참조가능하도록 만들어야 됨.
- 참조->캡션삽입

- 본문에서 참조->상호참조 하면 in Figure 1이런식으로 만들어짐.

Mendeley 논문의 세부정보 업데이트하기

 - https://blog.mendeley.com/2011/03/31/easy-one-click-addition-of-papers-from-highwire-press-bmc-plos-arxiv-and-more/
 - mendeley에 논문을 추가하고, arxiv의 주소의 숫자부분(e.g. 1600.00001 or 1600.00002v2)를 우측 Catalog IDs의 ArXiv ID에 복사 후, 돋보기버튼을 누르면 알아서 관련 논문의 내용이 업데이트 됨.

Mendeley에서 ArXiv는?
Type: Journal Article, Journal name: arXiv preprint로 함.

Mendeley로 논문 가져오기
 - mendeley browser add-in을 설치 & login을 하고
 - 관련 arxiv 논문 사이트에서 add-in버튼을 클릭하면 정보 + 논문을 mendeley로 가져올 수 있음.

워드에서 문단(paragraph)이 이어지지 않는 경우
 - 워드에서 paragraph가 앞쪽의 내용에서 이어지지않고 다음 페이지 처음부터 시작하는 경우가 있음
 - 이 경우, 문단 사이 혹은 문단과 section제목 사이에 큰 공백이 존재함.
 - page break (ctrl + enter 혹은 Insert | Break: Page break) 혹은 section break 때문
 - 홈 -> Paragraph -> -><-버튼 클릭 ->page break/section break를 선택/삭제
 - 혹은 떨어진 문단 전체를 선택 -> -><- 버튼 클릭하여 break 삭제
 - 만약 그 문단을 drag했을 때, Figure Box가 같이 drag된다면, Figure Box의 위치를 옮길 경우 (cut & paste) 해결 될 수 도 있음.

two column 워드에서 two column에 걸치는 그림 넣기
<https://sec.tistory.com/entry/MS-word-%EB%8B%A4%EB%8B%A8-%EC%82%AC%EC%9D%B4%EC%97%90-%EA%B7%B8%EB%A6%BC-%EB%84%A3%EA%B8%B0>
1) 그림 넣을 부분에 커서 -> [레이아웃 -> 나누기 -> 이어서] -> [레이아웃 -> 단 -> 하나]
2) 그림 삽입 후 크기 조정
3) 그림 넣은 다음 줄 -> [레이아웃 -> 나누기 -> 이어서] -> [레이아웃 -> 단 -> 둘]



2019년 6월 13일 목요일

ubuntu에서 thunderbolt통해 NVIDIA eGPU연결하기

0. ubuntu 16.04, thunderbolt 3, eGPU Akitio, NVIDIA GTX TitanX로 준비함.

1. eGPU에 그래픽카드를 꼳고 thunderbolt를 연결한다.

2. ubuntu를 부팅하고 다음을 입력하여 nvidia driver가 잡히는지 확인한다.
>> lspci -v | grep -i nvidia
~~~nvidia~~~가 떠야함.

3. 만약 안뜬다면 Booting시 bios진입 -> config thnderbolt3하여
 -> BIOS Assist Mode: Enabled
 -> Security Level: No Security
로 수정한다.

4. 2번을 다시 확인한다. 된다면 보통 GPU설치하듯이 드라이버, CUDA, cudnn을 설치하면 된다.

만약 안된다면 ubuntu버전을 확인해보자. uname -r
https://askubuntu.com/questions/1014147/ubuntu-with-thunderbolt-3-port-for-dual-external-displays
thunderbolt는 4.13부터, TB3는 4.16.6부터 지원한다고 한다.(하지만 나의 경우, 4.15.0-51-generic임에도 된다)

 

* bbswitch: No discrete VGA device found

부팅시 위와 같은 에러가 생긴다면 


2019년 4월 14일 일요일

[공부]python의 decorator

https://jupiny.com/2016/09/25/decorator-function/

어떤 함수가 있다.
def plus(a, b):
    return a + b

if __name__ == '__main__':
    plus(1, 2)

그 함수가 일어날 때 마다 어떤 동작 (소요시간 체크, 결과값 확인)이 일어나게 하고 싶다.
def plus(a, b):
    return a + b

import time
def tictoc(func, a, b):
    start_t = time.time()
    ret = func(a, b)
    end_t = time.time()

    print(end_t - start_t)  # 소요시간
    print(ret)                 # 결과값
    return ret

if __name__ == '__main__':
    # plus(1, 2)    tictoc(plus, 1, 2)

tictoc함수에 함수 plus를 인자로 넣어줌으로써 해결하였지만, 문제점이 있다.
함수의 인자가 늘어나면 또 새로운 tictoc함수를 만들어줘야 한다. 

decorator를 사용하면 더 간단하게 해결가능하다.

import time
def tictoc_decorator(func):
    def wrapper(*args, **kwargs):
        start_t = time.time()
        ret = func(*args, **kwargs)
        end_t = time.time()

        print(end_t - start_t)
        print(ret)
        return ret
    return wrapper
@tictoc_decorator
def plus(a, b):
    return a + b

if __name__ == '__main__':
    plus(1, 2)

    help(plus)

그런데 이런 함수형 decorator는 지저분하기에 class형 decorator를 쓰는 것이 더 깔끔하다

class tictoc():
def __init__(self, func):
self.func = func

def __call__(self, *args, **kwargs):
start_t = time.time()
ret = self.func(*args, **kwargs)
end_t = time.time()

print(end_t - start_t)
print(ret)

return ret

   


2019년 1월 10일 목요일

tensorboard 사용법

0. 먼저 tensorflow가 깔려있어야 함.

ex)
conda create -n tb python=2.7
conda activate tb
conda install -c anaconda tensorflow
conda install tensorboardXdfdfdf

 

1. tensorboard를 그대로 활용하기(5분 사용법)

https://medium.com/@anthony_sarkis/tensorboard-quick-start-in-5-minutes-e3ec69f673af
위 링크에 잘 나와있다. 아래는 그것을 요약한 것이다.

a. 값을 알고 싶은 부분에 아래 코드를 삽입한다.
pred = tf.nn.softmax( ... )
tf.summary.histogram('pred', pred)

loss = ...
tf.summary.scalar('loss', loss)

b. tf.Session()에 writer를 정의하고, training loop에 merge 및 writing하는 코드를 삽입한다.
with tf.Session() as sess:
  train_writer = tf.summary.FileWriter('저장경로', sess.graph)

  for i in range(70000):
    merge = tf.summary.merge_all()
    summary, total_loss, ... = sess.run([merge, loss, ...], ...)
    train_writer.add_summary(summary, i)

c. 학습을 시작한 이후, terminal에 tensorboard --logdir 저장경로(혹은 그 상위 경로)에 입력 후,
주어지는 링크를 클릭하면 됨.

d. 이상하게 위의 코드를 사용하면 몇 iteration을 못 돌고, 시스템이 죽어(아마도 메모리문제로), 아래 코드를 대신 사용함.

2. tensorboardX를 활용하는 방법(3분)

https://github.com/lanpa/tensorboardX
tensorboardX는 tensorboard를 쉽게, 다른 framework에서도 사용하도록 만든 library로 위에 사용법이 나와있다. 아래는 그 사용법을 요약한 것이다.

a. pip install tensorboardX 로 다운받는다.

b. 아래 코드를 삽입한다(위의 코드에 대응하는 부분은 bold로 표시).
from tensorboardX import SummaryWriter
writer = SummaryWriter('저장경로디렉토리')
# '저장경로디렉토리' 대신 comment='태그'으로 하면 현재 날짜-태그 형식으로 저장함.

for i in range(70000):
  total_loss, ... = sess.run([loss, ...], ...)
  writer.add_histogram('pred', pred, i)
  writer.add_scalar('loss', total_loss, i)
  writer.add_image('img', img, i)


  ftr = ... [100, 784]
  writer.add_embedding(ftr, metadata=label, label_img=images.unsqueeze(1))

# scalar값은 아래와 같이 json파일로 저장도 가능.
writer.export_scalars_to_json(json파일경로)
writer.close()

c. 학습을 시작한 이후, terminal에 tensorboard --logdir 저장경로(혹은 그 상위 경로)에 입력 후,
주어지는 링크를 클릭하면 됨.

d. 이상하게 위의 코드를 사용하면 몇 iteration을 못 돌고, 시스템이 죽어(아마도 메모리문제로), 아래 코드를 대신 사용함.

자동 마우스 클릭 script

예전에 프로그램이 잠깐씩 멈춰있는 경우가 있었다. 이 때, 그 프로그램을 한번 클릭해주면 다시 동작했는데, 이걸 자동으로 주기적으로 해주는 script를 아래와 같이 만들었다.

# xdotool 설치
sudo apt-get install xdotool

#script파일 작성
In my_script.sh
===================================
#!/bin/bash
while sleep 600; do
  xdotool mousemove 742 222 click 1 &
  sleep 1
  xdotool key KP_Enter &
  sleep 1
done
===================================
위에서
sleep 600은 600초(=10분)동안 sleep시키는 명령어.
xdotool mousemove 742 222 click 1 &은 742, 222로 옮겨서 왼쪽 클릭하라는 의미
xdotool key KP_Enter &는 키보드 엔터키를 치라는 의미

2018년 12월 4일 화요일

linux에서 NAS(samba)서버 이용하기

https://www.cyberciti.biz/tips/how-to-mount-remote-windows-partition-windows-share-under-linux.html

linux서버에서
sudo mkdir -p /mnt/NAS서버포인트이름(linux에서 NAS서버 지칭할 이름)
sudo mount -t cifs //NAS_IP/접근원하는 디렉토리 -o username=아이디,password=암호 /mnt/NAS서버이름

cd /mnt/NAS서버이름 으로 접근가능.

만약 처음하건, mount: wrong fs type, bad option, ... 나오면 아래 입력.
sudo apt install cifs-utils
sudo mount -t cifs //IP/DIR /mnt/NAS서버포인트이름/ -o username=ID


mount: ~~~ is write-protected, mounting read-only
mount: cannot mount ~~~ read-only



2018년 11월 20일 화요일

[공부]python에서 class 상속

<참고: http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-oop-part-5-%EC%83%81%EC%86%8D%EA%B3%BC-%EC%84%9C%EB%B8%8C-%ED%81%B4%EB%9E%98%EC%8A%A4inheritance-and-subclass>

class와 inherit(상속)은 Dont' Repeat Yourself (불필요하게 같은 코드를 반복하는 것을 막자) 가 목적.

목적: 기본 클래스(예: Fruit)와 그 서브클래스(예: Apple, Banana)가 있는 경우는 기본 클래스(공통 속성)-서브클래스(개별 속성)로 가는 것이 유지/관리측면에서 좋음.

Fruit과 Apple을 만듬.
class Fruit(object):
    def __init__(self, color):
        self.name = self.__class__.__name__        self.color = color

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))

class Apple(Fruit):
    pass
if __name__ == '__main__':
    apple_1 = Apple('green')
    apple_1.show_status()
    help(Apple)
 # class Apple에서 __init__찾음. 없으니 부모 class인 Fruit에서 __init__찾아서 실행.
name: Apple
color: green

class Apple의 초기화 함수에 Size를 추가해보자.
바보같은 사용법
class Fruit(object):
    def __init__(self, color):
        self.name = self.__class__.__name__        self.color = color

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))

class Apple(Fruit):
    def __init__(self, color, size):
        self.name = self.__class__.__name__        self.color = color
        self.size = size

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))
        print('size: {}'.format(self.size))

if __name__ == '__main__':
    apple_1 = Apple('green', 30)
    apple_1.show_status()
    help(Apple)
목적은 달성했으나, Fruit에 있는 코드들(name, color)이 반복됨. 

멍청한 사용법
class Fruit(object):
    def __init__(self, color):
        self.name = self.__class__.__name__        self.color = color

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))

class Apple(Fruit):
    def __init__(self, color, size):
        Fruit.name = self.__class__.__name__        Fruit.color = color
        self.size = size

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))
        print('size: {}'.format(self.size))

if __name__ == '__main__':
    apple_1 = Apple('green', 30)
    apple_1.show_status()
    help(Apple)

    apple_2 = Apple('red', 10)
    apple_2.show_status()

    apple_1.show_status()
class의 instance가 아닌 class에 값을 대입함.
apple_1의 값 변경은 apple_2의 값도 바뀜. --> 의도하지 않은 결과.

이 경우는 super()함수를 이용하여 부모 클래스의 도움을 받아야 함.

올바른 사용법
class Fruit(object):
    def __init__(self, color):
        self.name = self.__class__.__name__        self.color = color

    def show_status(self):
        print('name: {}'.format(self.name))
        print('color: {}'.format(self.color))

class Apple(Fruit):
    def __init__(self, color, size):
        super(Apple, self).__init__(color)
        self.size = size

    def show_status(self):
        super(Apple, self).show_status()
        print('size: {}'.format(self.size))

if __name__ == '__main__':
    apple_1 = Apple('green', 30)
    apple_1.show_status()
    help(Apple)

위와 같이 사용하면 중복된 코드를 방지할 수 있다.

help(Apple) # Apple class가 이름을 찾는 순서를 보여줌(자기 클래스 namespace, 부모 클래스 namespace, 내장 object namespace).


2018년 11월 19일 월요일

python에서 Enum의 사용

<참고: https://docs.python.org/3/library/enum.html>

from enum import Enum

class Color(Enum):
  RED = 1
  GREEN = 2
  BLUE = 3

Color = Enum('Color', 'RED GREEN BLUE')

위 두가지 타입의 선언법은 동일함.

Enum 라이브러리(모듈)는 심볼릭 멤버에 unique하고 constant인 상수를 부여하여 관리하고, 추가적인 함수를 제공함.
- iteration: for color in Color로 사용가능.
- 비교가능: Color.RED is Color.BLUE -> False 나옴. (is, == 모두 가능)
- 크기비교 불가능

2018년 8월 28일 화요일

python delete variable and free memory

문제: python에서 명시적으로 변수와 그 메모리를 지우자.

답:
python은 기본적으로 garbage collector(gc)를 써서 사용자가 메모리 걱정없이 쓰게 해줌.
그럼에서 위의 것을 명시적으로 하고 싶다면...

del var
# var변수를 지움(그러나 메모리가 지워지지는 않을 수 있음, del은 reference count를 줄이는 일반하고 이게 0이 되어야 release되는 듯)

import gc
if gc.isenabled() is True:
    gc.collect()
# gc를 명시적으로 호출함. 그럼에도 os상황이나 thread상황에 따라 안되는 경우가 있다고 함.




2018년 7월 29일 일요일

윈도우즈, 리눅스, Synology NAS 특정시간 후 자동으로 끄기


특정시간에 자동으로 윈도우즈와 리눅스, Synology NAS를 종료시키는 방법

* 윈도우즈
윈도우즈 커맨드 창에서 (Windows키 + R -> cmd입력),

shutdown -s -t 3600

-t: 3600초 후에 종료(-s)됨.
--> 입력 후 언제 종료될지 알림으로 알려줌.

shutdown -a
취소시킴.

shutdown -help
도움말

shutdown -h
하이버네이션(최대절전모드)


* 리눅스
sudo shutdown -P +60
60분 후에 종료됨.
--> 입력 후 언제 종료될지 년/월/시/분/초로 알려줌.

sudo shutdown -P now
지금 종료됨.

sudo shutdown -c
취소(cancel)시킴.


* Synology NAS
웹브라우저로 log in
제어판->정보센터->(좌)하드웨어 및 전원->(상)전원예약->설정



<참고: https://unix.stackexchange.com/questions/120506/how-to-shutdown-linux-at-a-specific-datetime-from-terminal>
<참고: https://coding-factory.tistory.com/326>
<참고: https://mongri.net/entry/%EC%8B%9C%EB%86%80%EB%A1%9C%EC%A7%80-%EB%82%98%EC%8A%A4-%EC%9E%90%EB%8F%99-%EC%8B%9C%EC%9E%91-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EC%A2%85%EB%A3%8C-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95>

2018년 4월 26일 목요일

conda environment managing

<ref: https://veranostech.github.io/docs-korean-conda-docs/docs/build/html/user-guide/tasks/manage-environments_ko.html>


1. conda 설치하기

Anaconda는 기업에서 사용하면 유료로 비추천. 그래서,

1.a. Miniconda + conda-forge

(안된다면 Miniforge로 설치)

윈도우즈는 https://github.com/conda/conda에서 다운로드

리눅스는 여기부터

mkdir -p ~/miniconda3

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh

bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3

rm -rf ~/miniconda3/miniconda.sh

~/miniconda3/bin/conda init bash

~/miniconda3/bin/conda init zsh

여기까지

 

설치 후 conda-forge channel 추가

conda config --add channels conda-forge

conda config --set channel_priority strict


설치 후 anaconda 채널 삭제 (defaults가 anaconda임)

conda config --remove channels defaults


설치 후 채널확인

conda config --show channels


channels:

    - conda-forge

라고 나와야 함.


** 설치했는데 에러가 나는데 잘 모르겠다면.

conda clean --all # 모든 cache삭제

conda update -n base -c defaults conda # conda 업데이트


2. 현재 env list 보여주기

conda info --envs 혹은
conda env list

0.1) env내 설치된 module보여주기
conda list -n [ENV_NAME]


3. create env / remove
() is option. 

설치
conda create --name [ENV_NAME] (python=3.6 scipy=0.15.0)


삭제
conda env remove --name myenv

3.1. 이름변경: 환경 복사 후 이전 환경 제거의 과정으로 이루어짐(clone->remove)
conda create --name new_name --clone old_name
conda env remove --name old_name -all

The result will be created in /envs/[Cray]

3.2. run env
conda activate [Cray]

3.2.2. pytorch 설치

# CUDA 11.4 

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch -c conda-forge

3.3. install modules
In [Cray] env,

conda install auto [ModuleName]

https://pytorch.org/get-started/previous-versions/


pip [ModuleName]


4. copy the current env into new env
conda activate [Cray]

conda env export > envfile.yml


This include conda package and pip package.


5. create env from other env file (env.yml)
conda env create -f env.yml


If you want to create the Conda env on the specific path, use this below command.
conda env create -f environment.yml -p /home/user/anaconda3/envs/env_name

 

6) list and set env list in specific conda env

conda env config vars list

conda env config vars set my_var=value

conda env config vars unset my_var -n test-env 

 


2018년 3월 21일 수요일

linux에 realsense 설치하기

realsense로 SR300을 사용

<참조: https://pypi.python.org/pypi/pyrealsense/2.0>
<참조: https://pypi.org/project/pyrealsense/>

환경: ubuntu 16.04, SR300

1. windows에 realsense를 누른 후, Firmware update함.

2. 설치
* 현재 python wrapper는 pyrealsense 2.x를 지원하지 않음. pyrealsense 1.x만 지원함.
혹시 2.x가 설치되었다면 아래를 참고하여 삭제할 것.
2.1. 설치 (realsense 2.x)
<참조: https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md>
만약 compile을 통한 설치를 원한다면 다음을 참조.
https://github.com/IntelRealSense/librealsense/blob/master/doc/installation.md

echo 'deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main' | sudo tee /etc/apt/sources.list.d/realsense-public.list

sudo apt-key adv --keyserver keys.gnupg.net --recv-key 6F3EFCDE

sudo apt-get update

sudo apt-get install librealsense2-dkms
sudo apt-get install librealsense2-utils

sudo apt-get install librealsense2-dev
sudo apt-get install librealsense2-dbg

# g++ -std=c++11 filename.cpp -lrealsense2

modinfo uvcvideo | grep "version:"
입력시 realsense가 보이면 설치 성공

*. 삭제를 원한다면
dpkg -l | grep "realsense" | cut -d " " -f 3 | xargs sudo dpkg --purge

2.1. 설치 (librealsense 1.x)
https://github.com/IntelRealSense/librealsense/tree/v1.12.1
https://github.com/IntelRealSense/librealsense/blob/v1.12.1/doc/installation.mdsudo 
에서 download zip파일(우상단 다운로드 클릭)

관련 library설치
apt-get update && sudo apt-get upgrade
sudo apt-get install libusb-1.0-0-dev pkg-config
sudo apt-get install libglfw3-dev

if 망가진 의존성이 뜬다면(쓰지말 것, 의존성 회복시키면서 기존 것 망가뜨림)
sudo apt-get install aptitude
sudo aptitude -f install

librealsense 설치
cd librealsense-1.12.1
mkdir build
cd build
cmake ..
make && sudo make install

cd ..
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger
./scripts/patch-uvcvideo-16.04.simple.sh

sudo modprobe uvcvideo

sudo dmesg | tail -n 50
을 통해서 새 usbcore: registered ~~~인지 확인

2.2. 설치 (pycparser, cython, numpy)
sudo apt-get update
sudo apt-get install python-pycparser
sudo apt-get install cython
sudo apt-get install python-numpy

sudo pip install pyrealsense

설치실패시 아래 사이트 참조.
https://github.com/toinsson/pyrealsense/issues/66 참조
pyrealsense는 librealsense2를 지원못함.
순서1을 통해 v1을 설치후 실행하면 됨.

3. 소스코드 사용
import pyrealsense as pyrs

serv = pyrs.Service()
serv.start()

'''pyrc.stream.color.depth.cad (color aligned on depth).dac (depth aligned on color)'''
cam = serv.Device(device_id=0, streams=[pyrs.stream.ColorStream(fps=60),
                                        pyrs.stream.DepthStream(fps=60)
                                        # pyrs.stream.CADStream(fps=60),                                        # pyrs.stream.DACStream(fps=60)                                        ])
scale = cam.depth_scale * 1000
while (True):
    cam.wait_for_frames()
    # print(cam.color)    current_color = cam.color[:, :, ::-1]
    current_depth = cam.depth * scale
    # current_cad = cam.cad[:, :, ::-1]    # current_dac = cam.dac * scale
    cv2.imshow('color', current_color)
    cv2.imshow('depth', current_depth / 1000)
    # cv2.imshow('CAD', current_cad)    # cv2.imshow('DAC', current_dac / 1000)
    cv2.waitKey(10)

2018년 3월 12일 월요일

Linux partition type

문제: Ubuntu에서 HDD의 Partition type을 보니, Filesystem ext4, extended, swap이렇게 있는데 이게 다 뭔가?

해결:
<참조: https://askubuntu.com/questions/40344/ext4-extended-linuxswap>

Linux의 partition은 3종류: primary, extended, logical

filesystem ext4는 primary, extended는 extended, swap은 extended내에 위치한 logical partition에 해당됨(그래서 swap과 extended의 용량이 동일).

swap은 가상메모리같이 hdd의 일부를 ram처럼 사용하기위해서 잡아놓은 공간으로 지우면 안됨.

2018년 3월 5일 월요일

python에서 현재시간으로 string만들기

<참조: https://stackoverflow.com/questions/3316882/how-do-i-get-a-string-format-of-the-current-date-time-in-python>

from datetime import datetime

def get_curtime_as_string():
    timestamp = '%d_%d_%d_%d_%d_%d_%d' % (
        datetime.now().year, 
        datetime.now().month, 
        datetime.now().day,
        datetime.now().hour,
        datetime.now().minute,
        datetime.now().second, 
        datetime.now().microsecond
    )
    
    return timestamp

2018년 2월 1일 목요일

Ubuntu 서버 활용하기 - client PC에서 서버로 파일전송, putty, pycharm-community사용하기

Ubuntu 서버 활용하기 - 파일전송
o 윈도우즈와 파일전송하기(winscp 사용)
1. https://winscp.net/eng/download.php 에서 다운로드 및 설치
2. Putty에서 정보가져오기(자동임)
3. 원격서버가 SSH가 설치되어있다면,
 - 파일프로토콜: SFTP
 - 호스트이름: IP
 - 포트번호: 22
 - 로그인 후, 이름/PW 입력.
 - 왼쪽이 local, 오른쪽이 remote server임. drag&drop으로 copy가능.

Ubuntu 서버 활용하기 - Xming + PuTTy 설치
<참고: http://blog.naver.com/PostView.nhn?blogId=oxcow119&logNo=60160622640>
Windows에서 GUI로 원격서버작업을 할 수 있단다.

** Server에서 **
cd /etc/ssh
sudo vi ssh_config

20번째 즈음
#  ForwardX11 no 를
ForwardX11 yes 로 수정 (#삭제, no->yes로 수정)

service sshd restart (서비스 재시작)


** Client on Windows에서 **
0. PuTTy 설치(windows는 홈피가서 다운로드)
1. https://sourceforge.net/projects/xming/ 에서 다운로드 및 설치(Full installation 선택 후, Don't install an SSH client클릭 - putty설치되어있으므로.)
2. XLaunch 실행 -> one window -> start no client -> Clipboard 체크 -> 마침
3. PuTTy실행 후, Session(기본화면)에서 IP, Port:22, SSH 입력.
4. Connection > SSH > X11에서 Enable X11 forwarding 체크, X display location에 localhost:0 입력
5. 세션모드에서 저장하면 편하게 사용가능.
6. 로그인 후, command & 치면 client PC의 화면에서 GUI사용가능.
 ex) firefox & --> firefox가 client에서 뜸.
 ex) gnome-session --> Xming에 Xwindow화면이 떠야하는데 안뜬다.

** Client on Linux에서 **
 linux는 sudo apt-get install putty으로 설치 후, 위 절차를 따라해도 되고 putty를 쓰지않고 ssh -X IP를 쳐도 됨.

Ubuntu 서버 활용하기 - Pycharm-community버전 쓰기
o gnome설치
 sudo apt-get install ubuntu-gnome-desktop
o pycharm-community버전 설치
 sudo add-apt-repository ppa:mystic-mirage/pycharm
 sudo apt-get update
 sudo apt-get install pycharm-community
o pycharm-community local에서 실행하기
 local에서 Xming클릭.
 server에서 pycharm-community입력.
client PC에서 pycharm을 쓸 수 있음.

Ubuntu 서버 활용하기 - docker container에서 pycharm사용하기
<참조: https://blog.jetbrains.com/pycharm/2017/09/pycharm-community-edition-and-professional-edition-explained-licenses-and-more/>
- pycharm community로는 불가능
- 이유는 remote control로 docker에 붙어야하는데, 이게 유료버전에만 존재함(위 링크 왜 Professional 버전을 써야하는지에 나와있음).

결국
WinSCP를 Ubuntu Explorer(?)처럼 pycharm을 개발환경으로, 실행은 command line으로 하는 이상한 구조가 되어버림.

2018년 1월 31일 수요일

Tyan server에 Ubuntu server 16.04.03 LTS설치, 그래픽드라이버, docker, deep learning 이미지 설치하기

목록
- 1. Ubuntu server 설치
- 2. 그래픽드라이버 설치(NVIDIA)

- 3. docker 설치
- 4. Nvidia docker 설치
- 5. Deep Learning용 image설치

1. Ubuntu server
1. ubuntu 사이트(https://ubuntu.com/download/server)에 서버버전 iso파일 다운로드하여 DVD에 굽기(16.04.3-server amd64 bit 사용함)
2. BIOS화면에서 F2/Del을 눌러 BIOS진입 -> 부팅순서를 DVD로 변경 후, 재부팅
3. ubuntu설치하기
  a. 언어는 English.
  b. network의 경우, enp13s0f0과 0f1이 있었는데, 0f0은 부팅용이라서 0f1을 LAN 케이블에 물리고 작업함.

  c. Hostname은 컴퓨터의 이름, User name은 사용자 이름이므로 주의해서 입력.
  d. Partition disk는 디스크를 지우고, auto로 할당함.
  e. 자동업데이트는 No automatic updates선택
  f. Server유형은 OpenSSH만 추가설치 (총 2개가 선택됨)
  g. 나머지는 모두 default값 사용함.
4. network 설정하기
  a. ifconfig -a로 네트워크 이름 확인(우리의 경우는 3.b.의 것 2개)
  b. sudo vi /etc/network/interfaces를 열고
    auto <네트워크이름>
    iface <네트워크이름> inet static
    address <IP주소입력>
    netmask <서브넷마스크>
    gateway <게이트웨이>
    dns-nameservers <DNS, 두개 이상은 공백으로, 주로 168.126.63.1 168.126.63.2 8.8.8.8 씀>
  c. /etc/init.d/networking restart 입력 후, 네트워크 적용안되면 reboot입력하여 재부팅
  d. ping 8.8.8.8로 동작확인
5. 프로그램 설치
  sudo apt-get update
  sudo apt-get install openssh-server

6. 원격접속용 컴퓨터에 putty설치(https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 후, IP넣고 접속.

2. 그래픽드라이버 설치(NVIDIA)
<참고: http://www.linuxandubuntu.com/home/how-to-install-latest-nvidia-drivers-in-linux>
1. 기존 NVIDIA 드라이버 삭제
 sudo apt-get purge nvidia*
2. 최신 그래픽 드라이버  버전 확인
 https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
 위 사이트에서 nvidia-graphics-drivers-*** 의 숫자 확인 (ctrl+f활용)
 http://www.nvidia.com/object/unix.html 에서 소유한 GPU가 위 버전 지원하는지 확인(해당버전 클릭 후, Supported Product tab누르면 됨.
  ex) TITAN Xp는 390가능
3. repository update
  sudo add-apt-repository ppa:graphics-drivers (시간 오래 걸림, 약 10분)
  sudo apt-get update
4. 그래픽카드 다운로드 및 설치
  sudo apt-get install nvidia-390 (390대신 2에서 찾은 번호 입력, 시간 오래 걸림, 약 1시간)
  * 만약, Unable to locate package nvidia-390이 나온다면,https://hiseon.me/linux/ubuntu/install_nvidia_driver/의 방법을 따라함.
5. reboot 후, 버전 확인
  reboot 혹은 sudo reboot(putty로 원격 접속한 경우)
  lsmod | grep nvidia 혹은 lsmod | grep nouveau
  위 명령어로 뭐라도 뜨면 됨.
6. 그래픽 드라이버 자동 업데이트 방지
  sudo apt-mark hold nvidia-390

3. docker 설치
<참고: https://subicura.com/2017/01/19/docker-guide-for-beginners-3.html>
o docker 이해하기
<참고: https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html>
- docker란 container가 동작하게끔 하는 가상화 플랫폼
- 가상화 방식
  -- OS가상화 - VMware나 VirtualBox; host OS위에 guest OS를 돌리기에 편하지만 느림.
  -- 프로세스 격리를 통한 가상화 - linux container; host OS위에 docker platform이 존재하고, 그 위에 library와 app이 개별적으로 돌아감. OS별도 설치는 불가능하지만 빠름.
- container: 이 안에서 실행하는 프로세스 들은 서로 영향을 주지 않고 동작. apt-get, yum등 자유롭게 설치가능. 설치시간도 매우 빠름(~10초).
- image: 특정 시점의 상태를 저장해놓은 변하지 않는 상태(가상CD의 image같은 것), image는 그것만으로 동작가능함(즉, 다운받아서 쓰면 돌아감)
- layer: image A에서 특정 lib B설치시 image C = A + B로 구성되어 효율적으로 동작하도록 만든 체계.
- client와 server(host): client에서 명령어 실행 -> docker daemon이 받아서 container에 toss -> 실행 결과 docker daemon에 toss -> client에 출력

o docker 다운로드 및 설치
<참고: https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html>
1. docker 설치 및 버전확인 - 너무 최신버전이면 nvidia-docker가 설치되지 않기에 다음을 추천
  <참고: https://docs.docker.com/install/linux/docker-ce/ubuntu/>
  a. 옛날꺼 지우기
  sudo apt-get remove docker docker-engine docker.io

  b. repository를 이용한 설치
  sudo apt-get update
  apt가 HTTPS사용토록 허락
  sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  c. docker GPG키 추가
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  d.
  sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  sudo apt-get update

  e. 그냥 최신버전을 설치하고프면(비추)
  sudo apt-get install docker-ce

  e. 만약 특정버전을 설치하고프다면
  sudo apt-get install docker-ce=17.12.0~ce-0~ubuntu
  apt-cache madison docker-ce
  으로 가능 버전 확인(nvidia-docker2는 docker 17.09.0까지만 지원)

  f. 버전확인
  sudo docker run hello-world
  docker version

  g. root아닌 user로 docker실행하기
  sudo usermod -aG docker 현재사용자ID

3. nvidia-docker설치
   <참고: https://github.com/NVIDIA/nvidia-docker>
    # 기존 nvidia-docker삭제
  docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
  sudo apt-get purge -y nvidia-docker

# repo설정
  curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
  curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
  sudo apt-get update

# 설치
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

** 만약 위에 것을 하다가 nvidia-docker2가 docker-ce 버전이 맞지않아 설치안된다고 나오면, docker와 nvidia-docker 버전이 서로 맞지않기에 이전 docker를 삭제, 재설치해야됨.
아래는 설치한 docker 삭제방법
<참고: https://stackoverflow.com/questions/31313497/how-to-remove-docker-installed-using-wget>
sudo apt-get purge -y docker-engine
sudo apt-get autoremove -y --purge docker-engine
sudo apt-get autoclean
sudo apt-get purge -y docker-engine docker docker.io docker-ce
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce

sudo rm -rf /var/lib/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo apt-get autoclean
** 잘되면 위의 것은 넘어가기

# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

4. Deep Learning용 image설치
a. CUDA, cudnn, tensorflow, caffe, theano, pytorch, keras, opencv가 설치된 image
  https://github.com/ufoym/deepo << CUDA, cudnn, tf, caffe, theano, pytorch, keras, opencv

- image 다운로드
docker pull ufoym/deepo 혹은
docker pull ufoym/deepo:py27

- 동작테스트
nvidia-docker run --rm ufoym/deepo:py27 nvidia-smi
==> nvidia-smi결과인 GPU상태들이 나옴.
nvidia-docker run -it ufoym/deepo:py27 bash
python
import tensorflow
import keras
==> 문제없이 되면 사용하면 됨.

참고:
pyTorch의 경우 shared memory를 사용함. 이 경우 늘려줘야 됨.
nvidia-docker run -it --ipc=host ufoym/deepo:py27 bash

참고: 저장공간 share between host machine and container
nvidia-docker run -it -v /host/data:/data - /host/config:/config ufoym/deepo:py27 bash
container의 /data 에서 host의 /host/data가 보이게 됨.

참고:
python commandline에서 Ctrl+D <== exit from python commandline

참고:
--rm 옵션으로 container가 종료 후, 삭제됬음.
interactive하게 쓰는 건 다음과 같이 입력
nvidia-docker run -it ufoym/deepo:py27 bash

b. caffe, opencv만 설치하고싶다면
https://github.com/w102060018w/caffe-opencv-cuda8.0-docker 의 이미지 사용

2017년 12월 6일 수요일

pyCharm에서 github 쓰기

문제: 개발 프로그램의 관리를 위하여 github을 사용하자. (pycharm, github기준)

작성일: 17.12.06 

업데이트: 23.02.01

 
Git: 파일 버전관리 시스템
 - 장점: 이전 상태로 돌리거나, 문제의 원인을 추적하고, 파일이 분실되어도 복구가능.
 - 단점: 익숙해지기까지 시간이 걸리고 귀찮음.

참고하면 좋은 사이트:
 - http://learnbranch.urigit.com/  애니메이션 기반으로 설명 잘해줌.
 - backlogtool.com 개념이해


구성
 - 작업폴더: 현재 프로젝트가 저장된 위치(실제 코드가 존재하는 작업공간)
 - localRepository: 현재 PC의 저장소(작업 폴더와는 다른 별도의 저장공간)
 - remoteRepository: NAS/GitHub/BitBucket 처럼 백업본을 저장할 원격 서버의 저장소

(참고: GitHub는 student email이 있으면 private저장소가 무료, BitBucket은 그냥 private저장소가 무료)

사용 예
상황1 - 이미 있는 프로젝트(PC) --> github에 올리기
<참고: https://recall2300.github.io/2016-12-26/pycharmxgit/command-line/>
  o 1. local git repository를 만들기
    - VCS -> Create Git Repository (위치는 임의에 가능하나, 현재 작업공간에 주로 만듬)
        완료되면 좌측 파일리스트 내 파일들이 빨간색으로 변함
        (색의 의미: https://www.jetbrains.com/help/pycharm/file-status-highlights.html#views)
        (빨간색파일: 파일은 존재하나 git관리대상 아님)
    - git관리가 필요한 파일을 체크하기
        파일 우클릭 > git > add
    - Git (VCS가 Git으로 바뀜) > commit > name, email 입력 후, commit

 o 2. Remote Repos. 만들기 및 연결
   - Git (VCS가 Git으로 바뀜) -> Github -> Share Project on GitHub
    -- Repository name: github에 만들어질 repo. 이름 입력(default도 괜찮음).
    -- Private를 원하는 경우 클릭 => Share 클릭.
(X) 만약 처 
음 VCS을 사용하는 경우라면 현 사용자에 대한 정보(email, name)를 입력해야 함.
ctrl+K로 commit changes 다이얼로그를 열고, 우측 Git/Author에 name<email>을 입력한 후, commit을 하면 됨.

이후 코딩을 하기 전에 할 일
 - 내가 로컬에서 작성한 코드와 원격에 저장된 코드와 차이가 있을 수 있기에(아마도 로컬에서 무언가 업데이트가 되었거나 협업코드라면 원격이 업데이트 상태일 수 있음)
 - 이를 동일하게 유지시켜주자.
 - VCS -> commit: 현재 로컬코드를 로컬 저장소로 업데이트.
  -- 팝업창에서 업데이트가 불필요한 폴더는 빼주고, 바뀐 코드는 확인 후, Commit.
  -- commit을 통해 여러 코드를 업데이트할 경우, message는 하나만 올라감.
 - VCS -> git -> Push: 로컬 저장소 내용을 원격 저장소로 업데이트.
 
코딩 작업을 하고나서 할 일.
 - VCS -> commit: 현재 파일들에 대한 스냅샷을 local repos에 기록(변화된 부분만 저장).
 - push: commit을 통한 변경정보를 remote repos에 업데이트한다. (localRep -> remoteRep)

상황2 - github에 있는 내용 가져와서 시작하기 
 - 1. pyCharm에서 New Project로 아무 프로젝트나 만들기
 - 2. VCS -> Get from Version Control
   - 2.1 만약 공개 repository에서 받는다면, 왼쪽 Repository URL을 입력하여 클론
   - 2.2 만약 개인 repository에서 받는다면, 왼쪽 GitHub선택하여 로그인 후, 원하는 repository를 선택하여 클론 
   - a. 만약 로그인이 안되면, Use Token으로 해볼 것: 
   - b. github사이트에서 setting -> Developer settings -> Personal access tokens -> Generate new token -> 필요할 권한 선택(repo, gist선택)
   - c. 혹은 이미 발행한 토큰이 있다면, github사이트에서 setting -> Developer settings -> Personal access tokens -> 발행한 토큰 선택 -> Regenerate token
   - d. 발행받은 토큰을 입력
 - 3. (불필요)혹시나 VCS -> Update Project 해봄
 
 

상황3 - Remote 서버(BitBucket/git저장소), Local PC1(소스트리 사용)에서 작업
- 0. 서버 repos 설정: BitBucket 로그인 후, repos 생성.
- 1. 서버-Local PC 연결: + -> Remote -> Bitbucket/ID -> Clone -> Local Folder/이름 설정. 이 때, Local Folder는 비어있어야 함.
- 2. PC1에서 작업시작-> src1.txt 생성
- 3. 작업 내용 기록하기: commit하기 스테이지에 올린 후, 우측하단 commit (locally saved).
- 4. 작업 내용 서버에 업데이트하기: push하기(좌 상단에 있음)


이후 코딩 시작전에 할 일.
 - clone or checkout: project 복사해오기(혹은 만들기)
 - pull: 서버의 변경사항만 가져오기 (remoteRep --> localRep & workFolder)
 


 - branch: commit에 대한 참조에 naming을 한 것. branch간 이동은 git checkout [브랜치명]으로 함.
 - checkout [브랜치명]: branch간 이동.
 - merge [브랜치명1] [브랜치명2]: 브랜치1을 2쪽으로 통합함.
 - rebase [브랜치명]: 현재 작업을 브랜치명쪽으로 옮김.
 - reset [브랜치명/HEAD~#]: 이전 커밋으로 돌리되 마치 안한 것 처럼 기록을 지움.
 - revert [브랜치명/HEAD~#]: 이전 커밋으로 돌리되 새로 커밋을 만들고 undo를 기록함.

Git repository cloud service
gitHub - 공개는 무료, 비공개는 유료(대학교 이메일 ID로 등록시 모두 무료)
bitbucket - 비공개도 무료
gitlab -
(참고: https://stackshare.io/stackups/gitbucket-vs-github-vs-gitlab)

Client tools
git kraken (linux/windows, free for non-commercial use)
Atlassian SourceTree (windows/mac, free)
Pycharm VCS - http://ngee.tistory.com/818 사용법

Error 모음
 - CRLF will be replaced by LF in ~
  -- windows코드와 linux코드를 혼용해서 사용하는 경우 발생.
  --

액션-시작
 - git init: git 저장소 생성.
 - git clone username@host:URL: 원격 저장소에서 복제.
 => local repo에 working directory, index(stage), HEAD가 준비됨.
 => working directory는 실제 파일
 => index(stage)는 변경내용을 임시로 기록.
 => HEAD는 최종 확정본(변경내용을 최종 기록 by commit).

액션-파일 추가/변경
 - git add <파일>: 파일을 git관리대상(index)에 추가.
 - git commit -m "msg": 변경사항을 local repo.에 업데이트함(HEAD에 반영).

 - git push origin <branch-name>: 변경사항을 origin이라는 remote repo.에 <branch-name>이라는 branch를 만들어서 업데이트함.
 => 이때 원격에는 원 코드 origin과 변경된 코드 branch가 같이 존재함.
 => 만약 동일한 branch에 update시, 서버와 내용이 다르다면(서버에서 clone한 시간 이후 서버 변경 내용이 존재시) push 취소 후, merge 시도 함.
 - git remote add origin <remote address>: origin이 clone한 것이 아니라면 주소를 추가해야함.

액션-branch갈아타기
 - git checkout -b <branch-name>: 가지 만들고 갈아타기
 - git checkout -d <branch-name>: 가지 지우기
 - git checkout master: 가지 갈아타기

액션-파일 갱신/병합

 - git pull: fetch(remote repo.->local repo.로 받아옮) + merge(코드 병합)

 - remote: remote repo.를 관리(추가, 삭제)
 
액션-되돌리기
 - git checkout -- <파일이름>: 변경내용 되돌리기

액션-특정 디렉토리를 git관리에서 제외

 - pycharm의 좌측 프로젝트 트리구조에서 해당 폴더 우클릭 -> git -> add to .gitignore -> git/info/exclude

 
즉. 작업 전 pull, 작업 후 working하는 것 확인 후, commit/push를 하는 것이 바람직함.

2017년 12월 1일 금요일

chrome remote desktop to linux접속에서 sidebar 가 없는 경우

문제:
구글 크롬 원격데스트탑에서 우분투로 접속시 사이드바가 없는 경우.

해결:
참조: https://productforums.google.com/forum/#!msg/chrome/LJgIh-IJ9Lk/Vajx_Q9OxdoJ
참조: https://superuser.com/questions/778028/configuring-chrome-remote-desktop-with-ubuntu-gnome-14-04/850359#850359

1. 원격데스크탑 실행종료
/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop

2. 기존 설정 백업
sudo cp /opt/google/chrome-remote-desktop/chrome-remote-desktop /opt/google/chrome-remote-desktop/chrome-remote-desktop.orig

3. 설정파일 수정하기
sudo gedit /opt/google/chrome-remote-desktop/chrome-remote-desktop

화면크기 수정하기
DEFAULT_SIZES = "1920x1080" (내가보는 모니터 해상도)

기존 모니터가 원격에서 보이도록 수정
FIRST_X_DISPLAY_NUMBER = 0

다음을 주석처리
#while os.path.exists(X_LOCK_FILE_TEMPLATE % display):
#  display += 1

다음을 주석처리 후 삽입

def launch_session(self, x_args):
    self._init_child_env()
    self._setup_pulseaudio()
    self._setup_gnubby()
    #self._launch_x_server(x_args)
    #self._launch_x_session()
    display = self.get_unused_display_number()
    self.child_env["DISPLAY"] = ":%d" % display
      #logging .info("Starting %s on display :%d" % (xvfb, display))
      #screen_option = "%dx%dx24" % (max_width, max_height)
      #self .x_proc = subprocess.Popen(
     #    [xvfb, ":%d" % display,
     #     "-auth", x_auth_file,
     #     "-nolisten", "tcp",
     #     "-noreset",
     #     "-screen", "0", screen_option
     #    ] + extra_x_args)
      #if not self.x_proc.pid:
     #  raise Exception("Could not start Xvfb.")

4. 원격데스크탑 재실행
/opt/google/chrome-remote-desktop/chrome-remote-desktop --start