tensorflow에서 GPU안쓰기

CUDA버전 tensorflow를 실행하면 GPU가 자동으로 활성화된다

학습할 때에는 GPU를 이용하면 훨씬 빠르지만, GPU 단점이 초기 설정하는데 시간이 오래걸린다

테스트할때에는 계산량이 비교적 적어서 GPU를 끄는 편이 더 빠르다

config = tf.ConfigProto(
        device_count = {'GPU': 0}
    )
sess = tf.Session(config=config)

위 코드를 넣어주면 GPU를 비활성화 한다

Advertisements

Pascal GPU 에서 Deep MNIST for Experts 예제 학습률이 안나오는 이슈

MNIST 데이터셋으로 Full Connected Network로 학습하면 잘 된다

그런데 Convolution Network으로 학습하면 학습이 안되는 문제점을 발견했다

그런데, cpu기반으로 학습하면 잘 된다

고생하다가 관련 자료를 겨우 찾았다

해결책은 cudnn버전을 최신(나는 5.1로 했음)으로 업그레이드 해준다

이 문제점은GTX1060 같은 Pascal GPU에서 나온다고 한다.

참고자료 : http://stackoverflow.com/questions/38036837/extremly-low-accuracy-in-deep-mnist-for-experts-using-pascal-gpu

ubuntu 14.04 에 nvidia gtx 1060 기반 cuda 7.5설치

아직 cuda 8.0이 정식 버전이 아니라서 불안해서 7.5 버전을 깔기로 결정

근데 cuda 7.5는 ubuntu 14.04 / ubuntu 15.04 만 지원 ㅠ_ㅠ

그래서 ubuntu 14.04에 cuda 7.5를 깔았더니 cuda 7.5에 포함된 nvidia graphic driver 버전이 낮아서(352.39) gtx 1060을 인식하지 못함

그래서 따로 nvidia graphic driver를 깔아줌

$ sudo add-apt-repository ppa:graphics-drivers/ppa

$ sudo apt update

위 명령 입력후에 Software Update 에서 Additional Update탭으로 이동하면 최신 버전을 선택할 수 있다(난 367.44 선택함)

리붓하면 gtx 1060이 인식되는 드라이버가 설치됨

그 이후에 cuda 7.5를 설치를 진행하는데, driver 랑 openGL 은 설치하지 말도록 한다

참고자료 : http://tipsonubuntu.com/2016/08/24/nvidia-367-44-support-titan-x-pascal-gtx-1060/

ps. 다음번엔 그냥 cuda 8.0 으로 가야겠다 ㅠ_ㅠ

RS232는 어떻게 동작하는가

이 글은 http://www.best-microcontroller-projects.com/how-rs232-works.html 내용을 무단!으로 번역한 글입니다. 영어 연습차원에서 번역한 글이라서 번역이 정확하지 않습니다

이 문서는 물리적인 레벨에서 RS232가 어떻게 동작하는지 설명한다. 이를 통해서 마이크로 컨트롤러 핀에서 나오는 신호의 의미를 이해할 수 있을 것이다.

RS232란 뭘까?

이것은 적은 수의 선을 이용해서 2개의 장치간에 데이터를 주고 받는 방법(또는 프로토콜)에 대한 내용이다. RS232는 하나의 신호 선을 이용해서 한 비트씩 시리얼 전송을 할때 사용된다.

데이터는 오직 한방향으로만 전송될 수 있기 때문에 양방향 통신을 하기 위해서는 2개의 선이 필요하게 된다.

2개의 선은 그라운드 선과 같이 묶여서 동작하기 때문에 동작을 위한 최소한의 선의 개수는 3가닥이 필요 하게 된다.

노트: 긴 거리에서 더 신뢰성있는 통신을 하기위해서는 RS232표준에 정의되어 있는 DTR DCT같은 다른 커넥션 핀들이 필요할 것이다.

더 명확하게 말하자면 RS232는 전자 장비간 데이터를 전송하는 비동기 커뮤니케이션 프로토콜이다.

기본적으로 이것은 3 ~ 22개의 선을 이용해서 100 에서 20k baud의 속도로 하나의 바이트를 전송할 수 있다. 일반적으로 사용되는 baud rate는 2400kbps, 9600kbps, 19200kbps이다. 케이블의 길이는 최대 50ft까지 가능하다. 더 높은 baud rate(38400, 57600)는 동작은 가능하지만 표준에서 지정한 스펙을 보장할 수 없다.

데이터 블럭의 바이트들을 전송하기 위해서는 한 바이트씩 전송해야 한다.

RS232는 어떻게 동작하는가

이 문세에서는 어떻게 RS232가 복잡한 핸드쉐이크 방법없이 동작하는지 설명한다. 오직 가장 단순한 시스템만을 설명할것이다. 이 방식은 가장 유용하고 많이 쓰이는 방식이다.

데이터는 두가닥의 선을 통해서 각각 한 방향으로 시리얼 전송된다. 밖으로 전송되는 신호선은 Tx라고 불린다. 데이터가 들어오는 신호선은 Rx라고 부른다. 양방향 통신 시스템을 구축하기위한 최소한의 선은 Tx,Rx,GND로 3가닥이다. 반대편에 있는 시스템와 데이터를 주고 받기 위해서는 Tx, Rx선을 서로 교차로 연결시켜야 한다.

이전 바이트가 전송된 이후라면 다음 바이트는 언제든지 전송될 수 있다. 전송된 바이트는 수신지와 동기화 되지 않는다. 이것은 비공기 프로토콜이다. 따라서 clock 신호선이 없다. 이런 이유로 각각의 시리얼 디코딩 칩들이 시리얼 데이터 스트림을 디코딩할 수 있도록 양단의 소프트웨어는 정확하게 같은 설정으로 동작해야 한다.

스크린샷 2016-07-07 오전 12.32.33

RS232는 어떻게 동작하는가 : Baud

이것은 간단하게 말하자면 초당 비트수 단위의 전송 속도이다. 이것은 각각의 비트 주기의 frequency를 정의한다.

2400 baud rate에서 주파수는 2400Hz이다. 비트 주기는 1/2400 또는 416.6us가 된다. 이 정보는 리시버가 데이터 스트림으로 부터 비트를 복원하기 위한 정보이다.

RS232는 어떻게 동작하는가 : 전압 레벨

트렌스미터

RS232는 데이터 비트 스트림 전송을 전송할 때 어떻게 동작하는가

긴 케이블을 통해도 동작하게 하려면 케이블의 저항이 전압을 낮추기 때문에 고 전압으로 전송해야 멀리 전송이 된다. 출력 전압 사양은 +5 에서 +25 (논리적으로 0) 과 -5V 에서 -25V(논리적으로 1)이다.

노트 : 케이블 상의 모든 신호는 같은 전압 레벨로 동작해야 한다.(e.g DTR, DSR, RTS, CRS) 따라서 RS232 모든 시그널을 구현하기 위해서는 많은 레벨 변환 칩이 필요하다 하지만 짧은 구간에서만 사용할 거라면 Tx,Rx,GND만 구현하면 된다.

리시버는 최소 ±3V만 되면 시그널을 처리할 수 있다.

최대 전압인 ±25V는 일반적으로 사용되지 않으며 보통 ±12V가 사용된다.(MAX232 트렌시버 칩의 출력 전압이다)

논리 1은 -12V로 전송되며 논리 0은 +12V로 전송된다. 일반적인 논리 형식과 반대로 뒤집혀있다.

노트 : 높은 전압을 가지는 시리얼 포트가 장치에 전력을 공급할 수 있을 거라고 기대할 수 있지만, 해당 장치들은 매우 적은 전류만 소비해야 한다.(?)

리시버

RS232는 데이터 비트 스트림 전송을 수신할 때 어떻게 동작하는가

리시버에서 입력 전압 레벨이 ±3V으로 정의되어 있다면, 논리 0은 반드시 3V보다 커야 하고 논리 1은 반드시 -3V보다 작아야 한다. 이런 방식은 노이즈가 발생하거나 선 길이에 따른 전압 강하가 발생하는 것을 허용한다. ±3V 레벨 까지의 노이즈들은 리시버에게 영향을 주지 않는다.

RS232는 어떻게 동작하는가 : 비트 스트림

RS232는 어떻게 동작하는가 – 시작 비트

이 프로토톨은 비동기로 구현되어 있기 때문에 전송할 때 어떠한 클럭 신호도 보내지 않는다. 대신에 다른 방식의 클럭 복원 방식이 사용된다.

리시버에게 바이트 데이터가 전송될 것이라는 것을 알려주기 위해서 각각의 전송은 시작 비트를 전송하는 것으로 시작한다.

시작 비트는 리시버가 데이터 비트를 동기화 하도록 한다. 리시버가 각각의 비트의 중간점을 샘플링 하기 위한 자신만의 클럭을 생성할 수 있는게 해준다. 리시버는 초기화 프로세스 과정에서 샘플링 주기가 설정되므로 스타트 비트만 한번 찾으면 나머지 비트들을 알 수 있게 된다.

RS232는 어떻게 동작하는가? – 데이터 비트

데이터 비트는 스타트 비트 뒤에 온다. LSB가 첫번째로 전송되는 걸로 시작해서 7개 또는 8개 데이터 비트가 전송된다. 7비트 또는 8비트중 하나는 선택하게 된 이유는 ASCII 코드에서 알파벳을 표현하기 위해서는 7비트만 있어도 가능하기 때문이다.

만약 당신이 텍스트만 전송하고자 한다면 7비트만 있어도 된다. 7비트를 사용하게 되면 대량의 데이터를 전송할 때 전송 속도를 증가시킬 수 있다. 다른 데이터 비트 크기로는 5비트 또는 6비트가 있다. 하지만 일반적으로 비트 길이 설정 옵션은 무시되며 대부분은 8비트 전송 모드를 사용한다.

노트 : 만약 당신이 RS232를 통해서 raw data(binary data)를 전송하고자 한다면 8비트 데이터 비트를 사용해야 한다.

RS232는 어떻게 동작하는가? – 패리티 비트

패리티 비트는 기초적인 전송 에러 검출 메커니즘이다. 홀수 패리티 또는 짝수 패리티를 사용하거나 아예 사용하지 않을 수도 있다.( 이경우 패리티 비트가 전송되지 않는다)

패리티 원리는 아주 간단하다. 모든 데이터 비트를 평가해서 만약 홀수개의 비트가 1이라면 홀수 패리티는 1이 된다. 반대로 데이터 짝수개의 데이터 비트가 1이라면 짝수 패리티가 1이 된다.

리시버 입장에서는 패리티 비트가 전송 도중에 에러가 발생했는지 알 수 있는 용도로 사용된다. 리시버 소프트웨어가 UART 모듈에 있는 flag를 확인하면 된다.

문제는 전송 도중에 2개의 비트가 동시에 에러가 발생할 경우 패리티 비트를 이용안 에러 검출이 안된다는 점이다. 왜냐하면 각각의 에러는 다른 에러를 상쇄시키는 효과가 발생하기 때문이다. 짝수개의 비트에서 에러가 발생하게 된다면 에러 검출은 실패하게 된다.

책상위에서 동작하는 시스템에서는 심각한 데이터 전송 오류가 발생되지 않기 때문에 이것은 문제가 되지 않는다. 짧은 케이블 거리에서는 아마도 전혀 에러를 만나지 못할것이다. 일반적으로 no parity 로 데이터 전송을 해도 전혀 문제가 없다.

긴 거리를 관통하는 시스템이나 노이즈가 심한 환경에서의 시스템에서는 패리티 체크보다 더 좋은 방법을 사용해야 한다. 예를 들면 CRC체크를 데이터 스트림을 주고 받을 때 같이 첨부하는 것이다. CRC는 에러 체크를 해줄 뿐만 아니라 데이터를 재전송하지 않고도 약간의 에러는 정정해준다.

RS232는 어떻게 동작하는가? – 스톱 비트

스톱 비트는 단지 다음 시작 비트가 전송 될 수 있도록 시간을 좀 벌어주는 역활만 한다. 스톱 비트는 스타트 비트의 반대 개념이다.

만약 스톱 비트가 없다면 마지막 비트는 패리티 비트가 된다.(패리티 비트를 사용하지 안으면 데이터 비트가 된다)

스톱 비트는 1, 1.5, 2비트 주기 중에 하나를 선택할 수 있다.

RS232는 어떻게 동작하는가 : 일반적인 설정

데스크탑에서 보통 사용하는 환경(예를 들면 마이크로컨트롤러 와 하이퍼터미널)에서의 일반적인 설정은 아래와 같다.

일반적인 Baud rate 설정

Baud 9600
Data bits 8
Parity None
Stop bits 1
Flow Control None

하드웨어 연결은 3핀만 한다(Rx, Tx, GND) – Rx 와 Tx는 서로 크로스 한다.

신호 : 신호 레벨에서 RS232는 어떻게 동작하는가

남은 핀을 이용하거나 제공 받은 라이브러리가 동작하지 않거나 하드웨어 로직을 아끼고 싶다 던 지 등등 여러 이유로 인해서 소프트웨어 UART를 만들고 싶을 수 도 있을 것이다.

노트 : 소프트웨어 USART 코드는 여기서 찾을 수 있다.

당신이 필요하는 실제 시그널 다이어그램을 만들기 위해서는 마이크로 컨트롤러 핀을 살펴보는게 좋다.(이상하게 웹에서는 찾기가 힘들다)

아래 다이어그램은 마이크로 컨트롤러의 출력핀에서 0-5V 로직 비트 스트림을 생성해서 RS232가 어떻게 동작하는지 보여주고 있다.
스크린샷 2016-07-07 오전 12.41.49

measure-baud-rate-example

 

ARMCC 에서 Warning Disable 시키기

mbed 잘 쓰고 있다가 자꾸 서버가 다운되고 느려지고 해서 고민끝에 mbed를 탈출 하기로 마음먹고 KAIL uVision으로 이사 작업을 진행했다.

진행하는 도중 Eigen 라이브러리를 ARMCC에서 빌드해보니

routine is both “inline” and “noinline”

위 경고가 엄청 많이 뜬다. 사실 저 경고는 다른 컴파일러에서도 발생하는데 Eigen의 DisableStupidWarnings.h 파일에서 컴파일러 지시문을 이용해서 없애고 있을 뿐이다.

ARMCC는 저 경고가 제거되지 않고 계속 나와서 없애는 법을 찾아보았다.

#pragma diag_suppress 2751

위 지시문을 지정해주면 2751번 Warning이 무시된다. 비슷한 지시문으로는

#pragma diag_error 2751

위 지시문을 지정해지면 2751번 Warning이 Error로 격상되서 컴파일 오류를 발생시킨다.

참고로 MSVC에서의 경고문 제거 지시문은 아래와 같다

#pragma warning( disable : 4100 )

참고자료
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bk/CIHECIAD.html

pulse audio 고생기

5422보드에서 오디오 작업을 하고 있는데 어느 순간 부터 재생음이 끊기고 겹치는 현상이 발생했다.
처음엔 안 괜찮다가, 어느 순간 부터 그랬다.
뭔가 apt-get으로 시스템 업데이트를 하면서 꼬였거나, 설정을 잘못 건들인 것으로 생각되서 문제점을 뒤졌다.
증상을 자세히 살펴보니,

$ aplay -D hw:0,0 test.wav

이렇게 명시적으로 장치를 지정하면 문제가 없는데,

$ aplay test.wav

이렇게 default 장치를 쓰면 문제가 발생했다.

차이점을 살펴보니 default 장치를 사용하게 되면, aplay가 PulseAudio PCM I/O Plugin을 이용해서 소리르 재생한다는 것을 알았다.

aplay는 alsa를 이용하는 저수준 프로그램인데 그 상위 계층인 PulseAudio에게 음악 재생을 시키다니..? 이해가 안됬지만, 뭐 편리함을 위해서 그럴수 있지…라고 결론짓고 이 부분은 그냥 패스..

문제의 핵심은 audio device -> ALSA -> PulseAudio로 넘어갔다.

PulseAudio는 디버깅 해본적이 한번도 없어서 자료를 찾아서 문제점을 파악하는 방법을 공부했다.
우선 PulseAudio는 환경설정 파일이 /etc/pulse 디렉토리에 몰려있었다.
여기서 특히 default.pa 파일은 어떤 모듈을 로딩할지에 대한 설정을 담고 있었다.
그 외에는 ~/.config/pulse 디렉토리에 안에 캐시 파일이나 개인 환경 설정이 저장된다.

여튼 PulseAudio가 밷어내는 출력 메세지를 보는 방법을 찾았는데 아래 문서에 자세하게 설명되어 있다.
https://wiki.ubuntu.com/PulseAudio/Log

$ echo autospawn = no >> ~/.config/pulse/client.conf

위 명령은 PulseAudio 서버가 자동으로 실행되는 것을 막아준다.

$ killall pulseaudio

이미 실행되고 있는 PulseAuido 서버를 다 죽인다.

LANG=C pulseaudio -vvvv –log-time=1 > ~/pulseverbose.log 2>&1

로그 기능을 활성화 해서 새롭게 PulseAudio 데몬 하나를 띄운다.

이렇게 해서 음악을 재생하면 긴 로그가 쌓이게 된다. 너무 내용도 길고 어려워서 뭔말인지 모르겠다…

그래서 실시간으로 보기 위해서 그냥 콘솔에서 직업 로그가 나오게 했다.

$ pulseaudio -vvvv –log-level=debug

이렇게 하고 다른 창에서 aplay로 음악을 재생해보니, 음이 문제가 되는 시점마다 로그에 아래 메세지가 찍힌다.

( 4.176| 0.000) I: [alsa-sink-Playback wm8960-hifi-0] alsa-sink.c: Increasing wakeup watermark to 40.00 ms

구글링을 통해서 정확한 답은 찾지 못했지만 비슷한 이슈를 하나 찾았다.
http://mailman.alsa-project.org/pipermail/alsa-devel/2015-August/097068.html

그래서 나도 /etc/pulse/default.pa 파일의 아래 라인을 수정했더니 잘 되었다!

load-module module-alsa-sink rate=44100 tsched=0

이 글은 Ubuntu 14.04 에서 테스트 되었음

PulseAudio 관련 명령어들

$ pacmd

이 문제를 조사하면서 참고한 자료들이다.
* https://wiki.ubuntu.com/PulseAudio
* https://wiki.ubuntu.com/PulseAudio/Log
* https://wiki.archlinux.org/index.php/PulseAudio/Examples