Saturday, July 19, 2008

이상한 나라의 폴

이상한 나라의 폴은 어린 나이에 보기에도 좀 이상했던 만화. 알록달록해서 좋아는 한것 같은데.
나라가 점점 이상한 나라가 되어 가는 것 같아서... 원래 그랬는데 이제야 알게 된건지.
어서어서 딱부리로 대마왕을 물리치고 니나를 구해야 할 텐데... 고생이 많넹.

Friday, July 18, 2008

논문 제목 달기

읽히기 위한 논문을 쓰려면 어떻게 해야 하나에 대해서 간간히 포스팅하고 있는데, 오늘 논문 검색을 하면서 생각난 것이 있었다. 읽을 논문을 정하기 위해서 가장 먼저 보는 것은 바로 '제목'이라는 점. 좋은 제목을 정해야 더 많이 읽히게 된다.



좋은 제목이란 뭘까? 물론 흥미를 끌 만한 제목이 좋은 제목이다. 그래야 선택받을 확률이 높아지므로. 흥미를 끌 만한 제목은 보통 논문에서 보이려 하는 것을 함축적으로 표현한 것일 것이다. 이게 뭔가 싶어서 읽어보게 하는 그런 제목. 그렇지만, 이런 제목을 달고 나온 논문이 그 만한 내용을 담고 있지 않다면 왠지 사기 당한 기분이 들지 않을까 싶다.

논문 제목에 있어서 또 한 가지의 이슈는, '검색'이다. 요즘 논문을 훑어보고나서 복사해 오는 시대도 아니고 자리에 앉아서 키보드를 또각거리는데, 검색 매칭이 잘 될수록 선택될 확률이 높아진다. 이런 제목을 정하기 위해서는 매우 구체적으로 논문에서 나타내려는 것을 적시할 필요가 있다. 구체적으로 적을 수록 길이는 길어진다. 그런데 너무 길이가 길면 또 눈에 잘 들어오지 않게 되므로 적당히 줄여야 한다.

여하튼, 논문 제목은 논문의 내용을 정확히 표현해야 한다. 내용 표현을 위해 들어갈 수 있는 것은, 6하원칙 중 '무엇을', '어떻게', '왜'의 세 가지이다. 이 중 '무엇을' 했는지는 뺄 수 없고, '어떻게' 했는지는 들어가는 경우가 많으며, '왜' 했는지는 매우 특정한 경우에 들어가는 것 같다.

1) 무엇을 했나: 논문에서 주장하고자 하는 것, 또는 보이고자 하는 것이 무엇인지 써야 한다. 보통은 가장 중요한 키워드, 그 중에서도 가장 핵심적인 것을 골라야 한다.
2) 어떻게 했나: 기본적인 방법론을 적는다. 이는 이미 잘 알려진 문제에 대한 접근 방법이 여러가지 있을때 어느 방법론으로 접근하는지를 나타낸다. 또는 잘 알려진 문제에 대한 새로운 방법인 경우 이 부분이 가장 중요한 키워드가 된다.
3) 왜 했나: 보통은 순수히 이론적인 논문이나 특정한 응용분야에 한정된 논문인 경우 쓴다. '~~~을 위한'으로 해석될 수 있는 제목이 이 부분에 해당한다. 이러한 단서가 붙어 있으면 독자들은 그 특정한 응용분야에 특화된 방법론으로 이해하는 경향이 강하다.

제목을 정할때는, 다음과 같은 방법이 많이 이용된다.
1) 키워드를 생각나는 대로 나열한다.
2) 중요도 순으로 정리한다.
3) 적당히 나열한다.
4) 불필요하거나 반복되는 부분을 뺀다.
5) 나머지를 다시 정리한다.

중요한 것은 '어느 부분을 넣고 어느 부분을 뺄 것인가' 인데, 간단한 방법은 해당 단어를 빼고 얼마나 정보량이 줄어드는 지를 보는 것이다. 정보량이 많이 줄어들면 중요한 키워드이므로 그대로 둬야 하고, 정보량이 거의 줄어들지 않는다면 뺀다.

예를 들어, 제목이 'Novel approach to face tracking for robotic applications' 라는 논문이 있다 하자. (제목은 방금 급조했음) 이 논문 제목에서 알 수 있는 것은, 이 논문이 얼굴 트래킹을 하는 논문이라는 것 이외에는 없다. 보통 new, novel, flexible, general, robust 와 같은 단어들이 논문에 자주 들어가는 데, 사실 이런 단어들이 주는 정보라는 것이 있기나 한 것인지 의문이다. 새로운 게 아니라면 논문을 왜 썼겠는가? flexible, robust나 general이라는 말을 쓰려면 '...에 대해'라는 식으로 특정해야 할텐데, 보통은 특정되지 않는다. 이 경우에 해당 단어의 정보량은 0. 'Robotic applications' 라는 말도 너무 모호해서 의미가 없다. 논문의 내용이 어떤 로봇의 기구적 특성을 활용한다면 더욱 구체적으로 적시하는 것이 맞고, 그냥 로봇에 안올려도 되지만, 굳이 로봇에 올려보았다라는 거라면 안쓰는 게 낫다. 역시 정보량이 0. 남는 것은 Face tracking 뿐이다. 만일 제목이 'Linear approach to 3D face tracking using modified template matching' 이었다면 (역시 제목은 없는 제목임) 훨씬 전달하는 내용이 많다. 이 제목에서는 독자들이 modified와 linear, 3D face tracking에 집중하게 되어 대충 어떤 내용을 찾아야 하는 지 기대하게 된다. (역시 modified가 모호하긴 한데, 없는 논문 제목을 만드는 거라 대충 했음) 만일 face tracking 키워드로 이 두 편의 논문이 나왔다면 어느 논문을 먼저 읽게 될지는 자명하지 않은가?

지나고 보면 논문 제목을 정하는데에 크게 신경을 안 썼던 것 같은데, 사실 이게 가장 중요하다. 자신이 논문 검색을 할 때를 생각하면서 논문 제목을 정해보자. 이전에 썼던 논문제목들을 보니, 참 어이없는 경우도 많아 쓴 웃음만 나온다. 어쨌든, 논문 제목을 먼저 확정하고 논문을 쓰지는 말자.

팁 하나 더. 그다지 중요하진 않지만.
저렇게 논문 제목을 달다보면 보통 길어진다. 그럼 두 줄 이상 되는 경우가 발생하게 된다.
만일 논문 제목이 'Motion estimation of multi-camera systems using perspective 5-point algorithm' 이라 하고, 한 줄에 다 안들어가면 어디서 자르는게 좋을까?
같은 제목은 아니지만, 나는 이렇게 잘랐더랬다.


Motion estimation of multi-camera systems
using perspective 5-point algorithm


근데 이렇게 자르는 게 더 좋단다.

Motion estimation of multi-camera systems using
perspective 5-point algorithm


왜냐면, 'using' 보다 그 뒤에 나오는 단어가 더 중요하기 때문.
Layout을 자신이 조정하지 못하는 경우가 대부분이고, 그리 중요하지는 않지만, 생각해 볼 여지는 있는 문제.

Wednesday, July 16, 2008

일본드라마 CHANGE

엔딩 크레딧 - Madonna의 Miles Away


정말 오랫만에 챙겨 본 일본드라마. 오래간만에 기무라 타쿠야가 주연을 하기도 했고, 연속극에서는 찾아보기 힘든 정치 소재 드라마라 눈여겨 보고 있었는데 마침 기회가 되어 완결을 보았다.

일본드라마는(만화도 그렇지만,) 한국드라마와는 조금 다른데, 주요 드라마들은 4분기로 나누어 제작하고 일주일에 1회 10화~12화로 완결한다는 점이 그렇다. 대부분의 경우 한 회에 해당 내용이 마무리되는 에피소드식으로 구성되는 것도 그렇고, 시청률이 높다고 해서 늘리기를 할 수 없는 점이 다르기도 하다. (대신 시청률이 낮아도 그대로 간다.) 완전 사전 제작은 아니라고 들었지만, 이런 제작 시스템이라면 중도에 스토리를 바꾸긴 어렵겠지. 대신 큰 스토리를 길게 이어가기는 어렵다. 대충은 큰 흐름은 에피소드의 나열로 메꾸는 형태라고 할까.

내용적으로는 꽤 교훈적인 주제를 내포하는 경우가 많다. 이상주의라고 해야할까. 다 보고나서 돌이켜 보면 도덕 교과서에나 나올 법한 이야기를 하고 또 하는 경우가 많다. 물론 시청자들도 현실과 다르다는 걸 알겠지만, 일종의 판타지겠지. 그래서 주인공들은 약간은 미숙하지만 이상을 갖고있는 사람으로 설정되는 경우가 많고, 주위의 현실적인 등장인물들은 회가 지나갈수록 주인공의 매력에 푹 빠져서 같이 이상주의자가 되 버리고 마는, 일종의 성장 드라마가 되는 경우가 많은 듯.

뭐... 일본드라마의 일반론은 이쯤에서 걷어치우자. 이 포스트를 쓰게 된 건, 최종화에 나왔던 대사 때문.
오노다 간사장은 아사쿠라 케이타 총리가 사임할 뜻을 갖고 있음을 알게 되어 만나러 온다. 오노다 간사장의 충고는 초심을 잃지 말라는 것. 이런 말을 남기면서...
"당신에게 국민들이 기대하는 건, 당신이 프로가 아니라 초보이기 때문이다."

존경하옵는 다케오 카나데 교수님의 저서 제목이 떠올랐다.
"초보처럼 생각하고 프로처럼 행동하라."
초보는, 경험이 없기 때문인지, 어떤 문제가 왜 어려운지 모르는 경우가 많고 머리 속에서는 이미 안되는 일이 없다. 경험이 쌓이고 쌓이면서 (대부분의 경우에는 실패의 경험이다.) 어떤 문제를 접했을 때 대충 감이 오게 된다. 이게 될 법한 일인지 아닌지. 점점 경험이 쌓여갈 수록 문제의 어려운 점을 더 쉽게 찾아내게 된다. 그러면서 문제가 정말 필요한지를 떠나 실현가능성이 있는지를 먼저 생각하는 경우가 많다. 프로처럼 생각하면, 세상에 안되는 일 투성이이고 될 만한 일은 이미 누군가가 다 해놓은 상태가 되고 만다.

하지만, 경험은 그런데 쓰라고 있는 것이 아니다. 초보처럼 생각해서 만들어 낸 문제의 해답을 찾기 위해 있는 거다. 안되는 이유를 찾기 위함이 아니라. 정치에는 초보였던 초등학교 선생인 아사쿠라 케이타가 본 정치 세계가 납득할 수 없는 것, 고쳐나가야 할 것 천지였던 것처럼 세상에는 아직도 그렇게 많은 문제가 풀리길 기다리고 있는지 모른다.

오노다 간사장의 말을 들으며, 한 가지 생각이 떠올랐다.

'인생은 누구나, 어느 순간이나 초보'


항상 어제와 같은 오늘이라고 생각하지만, 사실은 어제와는 조금은 다른 나이기에, 또 환경이기에 어제와 같지 않은 오늘을 살아야 하는 나는 초보일 수 밖에 없다는 생각이 들었다. 누구에게나 마찬가지겠지만. 항상 처음으로 겪는 일을 겪고 있으면서, 뭐든 다 알고 있는 듯 예단하며 살아온 건 오만한 프로의 생각이 아니었나 하는 생각이 들며 부끄러워졌다.

Tuesday, July 15, 2008

곰돌이 푸~

참... 인터넷엔 없는 게 없다. 일요일 아침 만화시간에 하던 푸우 주제가.
나보고 푸우 닮았다고 하길래 생각난 김에 검색. (하긴 살이 쪘을땐 그랬나?)
푸우에 나오는 캐릭터는 모두 크리스토퍼 로빈의 봉제인형.
귀염둥이 캐릭터가 많이 나온다.

하지만... 나의 favorite character는 역시 이요르~
이요르는 어록도 많다... 그 중에 하나
"A tail isn't a tail to them, it's just a little bit extra at the back."
노인같이 말하는 게 꼭 나 같지 않아? ㅎㅎㅎ

Monday, July 14, 2008

C 함수를 CUDA로 포팅하기

CPU에서 구현했던 각종 C 함수를 GPU에서 돌리기 위해 며칠째 똑같은 삽질을 계속하는 중.

GPU는 서로 다른 자료를 가지고 동일한 연산을 수행하는 데에 매우 탁월하므로 상당한 가속이 이루어질 것으로 생각하고 포팅하고 있지만 여러가지 난제에 부딪히고 있다.

1) 알고리즘 복잡도
물론 상당히 복잡한 알고리즘도 포팅할 수는 있겠지만, 과연 효율적인가에 대해서는 의문이 남는다. 주지한 바대로 GPU상에서 가속되는 요인 중 하나는 동시에 여러 쓰레드가 돌기 때문이다. 동시에 구동 가능한 쓰레드의 수는 세 가지의 요인에 의해 결정된다. 첫번째는 사용된 레지스터의 수이고, 두 번째는 shared memory의 크기, 마지막 하나는 사용한 GPU의 사양이다. 이 세 가지는 런타임에 결정되는 것이 아니라 컴파일 시점에 결정되는데, 사용한 컴파일러 (정확히 얘기하면 CUDA nvcc의 버전)에 따라 다르게 결정되므로 CUDA 라이브러리의 버전을 잘 결정할 필요가 있다.

예를 들어, hypothesis-test의 형태를 갖는 알고리즘을 만든다고 하면, test단계는 보통 비교적 간단한 사칙연산으로 해결되는 경우가 많다. 이러한 사칙연산에는 GPU가 매우 강력한데 이는 비교적 레지스터를 적게 쓰면서 해결할 수 있고, 구현상 branch가 적은 단일 flow process가 되는 경우가 많기 때문이다. 이러한 구조의 계산에서 병렬계산은 매우 강력하며 상당히 많은 수의 쓰레드를 동시에 수행할 수 있다. 반면, hypothesis 단계는 단순 random process나 markov random walk의 경우처럼 간단하게 구현되는 경우가 아닌 model fitting이 필요한 경우라면 비교적 복잡해진다. 특히 수치해석기법이 활용된 경우에는 수많은 반복 연산과 divergent branch가 존재하므로 그만큼 많은 레지스터를 소모하게 된다.

간단한 예로 numerical recipe등에 있는 singular value decomposition 알고리즘을 보면, householder matrix로 바꾸어 reduction하는 과정을 거치는데, 이 과정에서 loop와 branch가 많아서 레지스터 소모량이 크다. svd를 한 번 사용하면 cuda 2.0 beta의 경우 레지스터를 거의 30개 정도 사용하게 되며 이 경우 쓰레드는 최대 16개 구동할 수 있다. 물론 그것만 할 수는 없으므로 더 사용하게 되면 동시 구동되는 쓰레드의 수는 더 줄어든다.

가속성능이 얼마나 나올지는 구현한 알고리즘에 따라 달라질 수 있다. 관건은 사용된 레지스터의 수를 줄이는 것이며 이는 컴파일러 성능에 비례한다.

2) pointer argument의 사용
CUDA로 포팅하면서 조금 난감한 문제 가운데 하나는 __device__함수에서 메모리 할당이 안된다는 점이다. GPU에서는 계산만 수행하므로 메모리관리는 외부에서 직접 해주어야 한다. 그런데 보통의 C 함수 구현에서는 보통 가변메모리를 할당해서 다른 함수의 인자로 넘겨주어 결과를 받아오는 경우가 많고 특히 벡터나 행렬연산을 하는 경우에 이런 패턴으로 구현하는 경우가 많다. 이러한 패턴은 CUDA를 사용해도 허용되지 않으므로 내부에서 사용될 메모리를 밖에서 미리 잡아 넘겨주어야 한다.

그러나 모든 부속함수의 모든 지역변수를 일일히 cudaMemAlloc으로 잡는 것은 너무 번거로운 일이고 device global 메모리를 사용하면 coalescing을 신경써야 하므로 일이 너무 커진다. 특히나 알고리즘이 복잡해질수록 더욱 그렇다. 이때는 shared memory를 사용해서 빠르게 access해야 하는데, 서로 다른 쓰레드가 서로 간섭하지 않도록 shared memory space를 디자인하는 것이 중요하다. 예를 들어 쓰레드의 갯수가 n이고 m 벡터를 인자로 넘기는 상황이라면, nm 크기의 shared memory를 잡아서 함수내에서 써 주는 식이다.

여기서도 볼 수 있는 것은 함수 내의 메모리할당이 많은 알고리즘일수록, 그리고 벡터의 크기가 클 수록 shared memory의 사용량이 비례해서 증가한다는 점이다. 쓰레드 블록내에서 shared memory의 크기가 한정되어 있으므로 global memory를 사용하지 않는다면 쓰레드 갯수를 늘리는 것이 한정되며 이는 가속성능을 저하시킨다.

shared memory를 얼마나 쓸지는 코딩 단계에서 결정되므로 신중히 결정해야 한다. 너무 크면 동시에 구동되는 쓰레드가 적어질 수 있고, global memory에 많이 할당하면 그만큼 쓰레드 수행 속도가 느려진다.
(shared memory 변수는 함수 내에서도 정의할 수 있는 것으로 보이나 가급적이면 전역변수로 선언하자. 컴파일러나 런타임라이브러리에 따라 다른 결과를 보이는 것 같다.)

3) Precision의 문제
GPU는 아직까지 single precision 계산만을 지원한다. CUDA 2.0과 GT200 GPU가 나오면서 double precision계산이 지원되기 시작한 것으로 보이지만, Compute Capa. 1.3이상인 GPU를 사용해야만 가능한 것 같다. 결국, 시도라도 해보려면 GT200을 사용하는 GTX280, GTX260이나 Tesla S1070, C1060중에 하나를 사용해야 한다는 의미. (2008년 7월 15일 현재)

결국 알고리즘이 double precision을 필요로 하는 경우에는 CUDA 활용이 제한될 수 밖에 없다. 이런 경우는 수치해석기법이 필요한 경우 많이 발생할 것 같은데, condition number가 작은 문제인 경우, 또 반복적인 계산을 통해 최적화를 수행하는 과정이 들어간 경우 등이 이에 해당할 것이다. 특히나 중간 계산값에 따라 결과 정확도가 많이 달라지는 경우에는 precision을 반드시 체크해봐야 할 것 같다.

진짜 이딴 식으로 살지는 말자 --;;

뭐... 멀리서나마 시끄럽게 돌아가는 한국 뉴스에 관심이 간다. 언제 돌아가게 될 지도 모르고... 사실 싸움구경 불구경이 재밌다고들 하지 않나. 재미로만 보기에는 좀 그런 뉴스들이 많긴 하지만.

특히나 공돌이로서 재밌는 구경거리는 봉하마을과 청와대 사이에 자료를 갖고 갔니 마니 하는 논쟁. 전자문서인 데이터베이스의 원본이 어쩌고, 서버를 통째로 떼갔다는둥, 근데 자료를 복구한다는 둥 하는 횡설수설 브리핑을 읽고 있으면 개그맨인건가 싶은 생각도 들고, 뜻도 모르면서 말을 하고 있는 사람이 좀 이상해 보이기도 하고. 인수인계할때 자료 준다니까 싫다 할때는 언제고 지금와서 없다고 난리법석을 부리는 것도 웃기고, (뭐.. 몽니부리는 거겠거니 하는 생각이었지만.) 누가 자료 준다고 하면 안볼거 뻔히 알면서도 일단 받아 챙기는 공돌이 습성이 생각나 조금 웃기도 했다. 다른 한 편으로는 전자문서의 열람과 사본제작이 다를 수 있는가에 대한 상당히 기술적인 논쟁까지 겹쳐지며 공돌이로서는 꽤 재밌는 논쟁이 되어가고 있었더랬다.

근데, 오늘 뜬 기사 둘.

靑 "盧측 기록반출로 국정운영 할 수 없어"
'前대통령 기록물 현직도 열람’ 법 추진

욕을 안할래야 안할 수가 없다.

원래 못보는 자료가 없어서 국정운영을 못한다는 건 또 무슨 해괴한 말이며, 전임자의 기록을 현직도 보게 만들겠다고? 왜 일부 자료에 대해서 20년 30년씩 비공개하는지에 대한 개념이 전혀 없는거냐? 조선시대 임금들도 못하던 걸, 그것도 다 이유가 있어 그리 하는것을 깡그리 무시한다니 어이가 없다.

첫번째 기사가 사실이라면, 대놓고 나는 병신입니다 하는거나 같은거고. 왜냐고? 원래 그 자료는 못보는 거라니까? 원래 없는 자료가 없어서 일을 못한다는 건 뭔 병신같은 개소리냐고. 주식회사 대한민국이라 인수인계할때 다 내놓고 가야하는거 아니냐고? 그런 정신머리로 국가의 일을 하니 나라꼴이 그 모양이지. 그럼 왜 준다 할때 안 받고 오렌지 타령이나 하고 있었냐고.

게다가 정말 굳이 필요하면 국회 2/3의 동의를 구해서 볼 수도 있는 길이 있다. (미국법의 예를 따른 거겠지만. 미국의 경우 전임대통령 자료의 정보공개를 요구한 현직대통령은 단 한 사람도 없다.) 이모저모 따져보면 너무 악의적이고 야비하다.

진짜 이딴 식으로, 야비하게 굴지는 말자. 노 전대통령이 데이터베이스 사본을 보유하고 있는 것 자체는 논란의 여지가 있을 수 있다손 치더라도, 지금 하고 있는 일은 지난 5년간 지겹게 들어야 했던 '이게 다 노무현 때문이다'를 앞으로 5년간 더 하고 싶다는 말에 지나지 않는다. 지난 대통령의 '비공개' 자료가 없어서 국정 운영을 진짜 못하겠다면, 그만 두라. 그게 없어도 해 낼 수 있는 사람이 있을테니. 의석이 많다고 개념없는 법안이라도 만들어서 전임자의 뒤나 캘 요량이면, 그런 식으로 밖에 '국정 운영'을 못하겠으면 그것도 무능력함을 인정하는 것 이상의 의미는 없다.

좀 흥분된 포스팅이지만, 무슨 저잣거리의 양아치도 아니고 한 나라의 국정을 담당하는 사람들인데 최소한의 양식과 개념은 좀 장착하기 바란다. 지금 하고 있는, 하려고 하는 저 짓은 정말 길거리 양아치만도 못한 저열한 의식의 발현일 뿐이다.