Daybreakin Things

Posted
Filed under 살아가기, 생각하기

이미 미투데이와 트위터에 실컷 얘기해놔서 알 사람은 다 알겠지만 신종플루에 걸렸다가 현재 회복되고 자택격리가 풀려 학교로 돌아온 상태다. 발병은 지난 주 토요일 오후였고 타미플루를 처방받아 복용하기 시작한 것은 일요일 오전이었으며, 확진검사 결과가 나온 건 그로부터 한참 뒤인 엊그제 금요일이었다. 내 생각에 신종플루에 걸린 가장 큰 원인은 봄학기 때부터 지금까지 거의 쉬지 않고 강행군을 했기 때문이 아닌가 싶다. 특히 이전 포스팅의 바탕이 된 PageRank 프로젝트를 하면서 밤을 많이 새면서 신체 리듬이 깨진 게 영향을 준 듯하다.

어디서 감염되었는지는 대략 예상하건대 학교 내 감염 or 금요일 서울 강남 쪽으로 외출했을 때 만원 지하철 탄 것 or 토요일 서울 신촌 외출 셋 중 하나일 것이다. 신종플루의 잠복기가 하루에서 일주일 정도라고 하는데 체력이 많이 떨어진 상태였으므로 금요일에 감염되어 다음날 발병했을 가능성이 높아보인다.

주변에 나 말고도 스팍스 동아리에만 확진 환자가 3명 이상 존재하고 집에서도 부모님이 주변에 아는 사람들의 경험담을 들어보니 사람마다 증상이 꽤 다르다는 것을 알 수 있었다. 나같은 경우는 목이 살짝 간질간질하다가 나는 잔기침이 초반에 살짝 있었고 거의 열만 났는데 병원에서 측정했을 때 열은 38도로 기록되었다. 영양수액을 맞고 주사로 약을 투입한 후 감기약과 타미플루를 처방받아 복용하면서부터는 감기약 약발이 받는 동안은 열이 어느 정도 내리다가 약발이 떨어지면 다음 복용 전까지는 계속 열이 나는 상황이 계속되었다. (타미플루 자체는 항바이러스제라서 증세 자체와는 별 관련이 없다) 병원 약 먹는 동안은 기침이나 콧물 등 일반적인 감기 증세 자체가 거의 없었다. 어렸을 때 몇 번 독감 걸려본 경험에 의하면 독감보다 강도는 훨씬 약했다고 볼 수 있다. 다만 온몸에 열이 상당한 정도로 지속되었기 때문인지 에너지 소모가 상당해서 부모님이 얼굴 살 빠졌다고 좋아하실(?) 정도였다; ㅋㅋ

나는 웬만해선 감기 걸려도 입맛이 떨어지는 경우는 별로 없는데, 타미플루의 영향인지 이번에는 입맛이 떨어져서 좀 고생했다. 특히 타미플루 설명서에 '음식물 섭취와 관계 없이 복용 가능하다'고 되어 있어서 빈속에 먹었다가 다음날 속이 메스꺼워서 죽는 줄 알았다;; 보통 건강한 성인의 경우 타미플루에 의한 영향은 복용 하루 정도 지난 후에 나타나는 것 같다. 인터넷에 보면 부작용이 심한 약이라고 경계하는 글들이 꽤 있는데 일반적인 경우는 큰 문제 없을 것 같고, 그 부작용보다 신종플루든 독감이든 빨리 낫는 게 더 도움이 되지 않을까 싶다. 사실 무엇보다 괴로웠던 건 며칠 동안 집에서만 계속 지내다보니 공기가 답답했던 것(어머니가 환기를 자주 시키는 편임에도 불구하고)과 주로 누워있다보니 오히려 나중에는 허리가 아팠다는 점이다.

우리 집에서는 옛날에 간호사 근무 경험을 가진 막내이모의 비법(?)으로 감기에 걸리면 타이레놀과 쌍화탕을 함께 먹는데, 일단 이 방법으로도 증상을 완화시키는 데는 효과가 있었다. 처음 증세가 나타난 토요일에도 이 방법으로 버텼고, 타이플루 복용이 끝난 다음날인 금요일에 잠시 감기 기운이 돌아서 뜨끈한 물로 샤워하고 이렇게 약을 먹은 후 잤더니 말끔히 회복되었다. 토요일에는 일부러 아버지와 함께 바깥 바람을 쐬러 시화호 상태습지공원에 갔다가 소래포구 어시장 구경을 했다. 오히려 그랬더니 집에만 있는 것보다 더 기운차게 회복된 것 같은데, 주변 감염을 특별히 조심해야 하는 경우가 아니라면 중간중간 맑은 공기를 쐬러 외출해주는 것이 도움이 될 것 같다.

문제는 이렇게 집에서 회복하는 동안 확률로보틱스 프로젝트 1개를 째고 작곡과제 1개를 째고 컴윤리 과제 1개를 째고 일주일치 수업을 몽땅 쨌다는 것. 수업에 빠진 거야 공결처리해준다지만 말이다.;; (다행히 이번 주 동안 새로 나온 과제는 없어보이는데... 잘 확인해봐야...으음-_-) 분산처리특강은 다행히 하루 휴강했기 때문에 진도 따라가는 건 별 문제 없을 것 같으나 확률로보틱스가 살짝 안드로메다로 가있을 것 같다. 작곡수업은 앞뒤 진도 의존성이 별로 없는 개별 토픽들을 다루고 있어서 수업자료만 보고 혼자 공부하면 별 문제 없을 것 같고. 회사에다가는 이메일로 알려서 그냥 일주일을 통째로 쉬어버렸다.

학교에 알린 것은 월요일 오전이었는데 포탈에 공지 올라온 것을 보니 건강관리실을 주말에도 운영하고 있어서 일요일에 바로 연락해도 되었을 것이다. 공결 처리 및 의료상조회에 의한 병원비 보전 등을 처리하기 위해 처방전 또는 약 포장지(특히 타미플루) 및 영수증 등을 나중에 제출하라고 했다. 전원 기숙사 생활을 하는 우리학교 특성상 원래 의심환자만 발생해도 룸메이트까지 몽땅 자택격리시켜버리는데 현재 내 룸메인 맆군의 경우는 ACM ICPC 서울대회 출전 관계로 내 발병 3일 전부터 아예 서울로 올라가버려 나와의 접촉이 없었기 때문에 격리되지 않았다. 그리고 이렇게 수업에 빠지는 경우가 많이 늘어서인지 오늘부터 룸메이트는 마스크 착용 등의 감염 예방 수칙만 지키는 것으로 조건이 완화되었다.

지금은 신종플루 확산이 진정세에 접어든 것인지 어떤지는 잘 모르겠는데(뉴스에는 북반구 몇몇 지역에서 정점으로 추측된다고는 하더만), 의심증세가 발생하면 주말인 경우 가까운 병원의 응급실을 아침 일찍 찾아가보는 것이 좋을 것 같다. 내 경우 수지삼성병원을 이용했는데, 근처 약국의 타미플루 비축분과 확진검사 키트가 준비된 수량이 많지 않아서, 내 다음 다음 순서까지만 제대로 진료받고 그 뒤로는 다음날 다시 오라고 하는 모습을 볼 수 있었다. 물론 평일에는 아마 매일 또는 며칠 간격으로 계속 보충할테니 별 문제 없으리라 생각한다. 의사의 처방은 감기약과 타미플루, 체력이 떨어진 경우를 위한 영양수액(이건 보험처리가 안 됨)과 주사약이었고 고기 등 단백질 섭취를 많이 하라는 얘기를 해주었다.

아무튼 이렇게 해서 뜻하지 않은 일주일 간의 가을 방학이 끝났다. 주변에서는 '아, 차라리 나도 신종플루 걸려서 좀 쉬었으면 좋겠다'는 얘기도 심심찮게 들리던데, 그래도 아픈 건 괴롭다. -_-; 특히 이번 신종플루는 (고위험군 아닌 건강한 사람의 경우) 증세 자체보다도 체력 소모가 많은 것 같다.

한 가지, 신종플루 덕분에 집에서 가족들과 함께 하는 시간이 많았던 것은 오히려 좋았다. 물론 가족들에게 옮기게 되면 안 좋지만 아버지와 어머니는 지금까지 아무 영향 없고 물컵과 수건 등을 따로 사용한 덕분인지 잠깐 발열증세가 있었던 형도 검사 결과 음성으로 판정되었다. 아버지와 형과 함께 스트레칭하고 신체를 이용한 놀이(딱히 이름은 잘 모르겠으나 다리 서로 걸고 발목으로 씨름하여 넘어뜨리기라든지 등등)도 오랜만에 하면서 온가족이 함께 웃는 시간을 가질 수 있었다. 한참 즐겁게 놀다가, 이렇게 같이 웃어본 게 얼마만이지- 하면서 신종플루라는 특수 상황을 통해서야 이런 시간을 낼 수 있다는 생각이 나서 살짝 서글퍼졌다. 학교에서 공부 열심히 하는 것도 좋지만 꼭 이렇게 살아야만 하는 걸까. 어머니가 자주 하시는 말씀은 카이스트가 대전에 있지만 않으면 집에서 통학했으면 좋겠다는 건데 학교 특성상 대전에 살아도 그건 좀 힘들 것 같고... 아무튼 우리가 어찌할 수 없는 상황이기에 안타깝다.

ps. 학교에 돌아와서 얘기를 들었는데, PageRank 프로젝트 후 수강생들 중에서 신종플루 관련으로 격리된 학생이 나 말고 2명이나 더 있단다. (그래서 휴강한 거라고...) 역시 그 프로젝트 빡세긴 빡셌던 듯. orz

Posted
Filed under 만들어내기

이번 학기에 듣는 문수복 교수님의 분산처리특강 프로젝트로 그 유명한 PageRank를 구현하였다. (혹시나 모르시는 분들을 위해 살짝 덧붙이면 Google 검색 엔진의 기초가 되는 웹페이지 중요도 판단 알고리즘이다) Google의 창업자 세르게이 브린과 래리 페이지가 썼던 PageRank 논문을 바탕으로 크기가 수백~수천만 단위인 sparse 행렬과 벡터의 곱셈을 계산하기 위해 matrix 계산 방식을 바꾼 power method를 활용하여 Hadoop 기반 MapReduce 방식으로 구현하였다.

특히 이번 수업에서는 여름방학부터 9월까지 NexR에서 인턴하면서 개발한 CCI:U Open CourseLabs (오픈소스 프로젝트도 참조) 및 KAIST 클라우드 컴퓨팅 테스트베드를 활용하여 작년에 했던 같은 수업보다 좀더 넉넉한 환경에서 쓸 수 있었다. 학과 자체에서도 가상화 클러스터를 만든 게 있어서 40코어 / RAM 32GB * 5 정도를 사용하고 여기에 CCI:U 클러스터는 48코어 / RAM 2GB * 48 규모로 함께 사용하였다.

PageRank에 대해 간단히 설명하면, 이전까지의 웹 검색은 키워드를 입력하면 그 키워드와 웹문서들을 분석하여 연관성이 높은 것을 뽑아주는 것이 기본 아이디어였지만 PageRank는 웹문서들 사이의 연결 관계를 주목했다는 점이다. 웹을 이루는 네트워크의 구조 자체를 랭킹에 포함시킨 것은 혁신적인 발상이었다. 원래 개념은 어떤 페이지에서 다른 페이지로 나가는 링크를 이용해 그 링크된 문서들의 PageRank 값을 그 각각이 가진 링크의 개수로 나눈 것을 모두 더한 것이 자신의 PageRank가 되는 것이다. 정의를 잘 살펴보면 상호 의존적인 정의이기 때문에 바로 값을 구할 수는 없다는 것을 알 수 있는데, 처음에 임의로 값을 초기화하고 몇 가지 조건을 더 고려하여 이 계산을 계속 반복해서 돌리면 어떤 값에 수렴하게 할 수 있고 그 결과가 PageRank 순위가 되는 것이다. 수학적으로는 연결 관계를 정의하는 거대한 행렬(행과 열의 개수가 인덱싱한 문서의 개수와 같은...)과 그 행렬과 곱해질 크기의 벡터를 이용하여 위 내용을 수식으로 표현할 수 있고, 이 거대한 행렬을 효과적으로 분산처리하기 위해 power method(링크된 글의 맨 끝 식이 실제로 사용한 것)라는 것을 이용한다.

NexR에서 인턴하면서 이런저런 실습을 하기도 했었고 MapReduce에 어느 정도 익숙하였기 때문에 처음 예상으로는 한 5일이면 되겠다 싶었는데, 웬걸 열흘이 넘게 걸려버렸다. 대상 데이터는 위키백과에서 XML 형식으로 제공되는 dump였는데 총 20GB 분량을 200여개의 파일로 나누어 놓은 것이었다. 알고리즘 구현은 4일 만에 끝났지만 최적화와 디버깅에만 3일이 넘게 걸렸고, 프로젝트 듀가 있던 주말에는 CCI:U 클러스터의 각 노드가 로그 파일로 인해 디스크가 꽉 차는 문제가 발생하여 이를 해결하느라 과제 진행을 못하기도 했다. PageRank 특성 상 어느 정도 수렴할 때까지 계속 반복(iteraion)해야 하는데 처음 짠 버전은 한 번 도는 데 6시간(!)이 넘게 걸렸지만 온갖 최적화와 삽질 끝에 완성한 최종 버전은 불과 2분밖에 걸리지 않았다. (좀 심하게 어이없는 버그가 하나 있었다. 돌아갔던 게 더 신기하달까 싶은...-_-) 허나 거기서 끝난 게 아니라 실제 검색엔진처럼 웹 상에서 키워드 입력하면 결과를 볼 수 있게 만들어야 하는데 결과로 나온 PageRank 벡터 및 문서 ID와 제목의 mapping 등을 DB에 올리는 과정에서 워낙 큰 용량으로 인해 몇 시간씩 돌렸던 것이 중간에 깨지고 버그로 중단되는 등 추가로 하루를 더 소요하였다.

참고로 위키백과의 각종 meta page와 redirection page들을 제외하고 총 3백만개가 약간 넘는 양의 문서에 대한 link graph와 PageRank를 계산하였다. 첨부한 파일은 처리한 데이터를 바탕으로 상위 100개의 페이지들을 모아본 것으로, 주로 나라·지명·년도가 많은 링크가 걸리고 있음을 확인할 수 있다. (좀 예전 데이터를 바탕으로 했기 때문에 현재의 위키백과하고는 다소 다를 수 있음) 원래는 iteration을 적어도 20~30회 이상은 돌려야 하지만 시간 부족 관계로 10번만 돌렸기 때문에 좀 부정확할 수도 있다.

상위 100개 보기

중간에 missing title이라고 된 것은 Redis라는 key-value storage를 검색엔진 구현에 사용하다가 너무 많은 데이터(대략 레코드 수 560만개?)가 들어가니 32bit 메모리 영역을 초과하여 더 이상 들어가지 못해 발생한 것이다. 문제는 이 프로젝트 때문에 지난 주와 이번 주 내내 거의 아무것도 못하고 밤샘하다가 수업을 5차례나 째는(...) 로드가 걸렸다는 것. 작곡 2번, 로보틱스 2번, 분산처리 1번...; ㅠ_ㅠ

PageRank 논문을 보면 1999년 당시 사용한 페이지 수가 7천5백만개였으니 내가 해본 데이터 크기가 대략 이것의 4% 크기인데, 그때와 지금의 컴퓨터 성능 차이를 생각해보면 Google이 얼마나 대단한지 알 수 있다. 3백만개의 원소를 가지는 벡터 2개 정도는 대충 1GB 메모리에 다 올려놓고 계산해버릴 수 있지만 저 정도 되면 논문에서 이야기한 것처럼 여러 pass에 걸쳐 계산하도록 만들어야 할 것이다.

어쨌든 이번 프로젝트를 통해 대용량 데이터를 다루는 작업이 얼마나 어려운지--조금만 실수해도 몇시간 분량의 작업을 날려먹으니--뼈저리게 깨달을 수 있었고, 또한 어떤 점들을 조심해서 짜야 하는지, Hadoop 사용·설정 노하우 등을 얻을 수 있었다. 3명이서 팀으로 하는 기말프로젝트 proposal로는 GPU 가속을 이용한 행렬 연산과 MapReduce programming model의 결합에 관한 아이디어를 발표했는데 이건 또 얼마나 삽질을 하게 될런지 모르겠다. ㅠ_ㅠ

덧: 교수님이 왤케 자꾸 밤새면서 작업하냐고 물으시길래 '연속적으로 집중할 수 있는 시간'을 확보하기 위한 거라고 말씀드렸다. 학생들끼리 같이 무얼 해보려고 해도 보통 낮에는 시간이 안 맞는 경우가 많아 밤에 뭘 하는 경우가 많다보니 낮엔 각자 다른 일을 하고 밤에 모여있는 것이 습관화되어 어쩔 수 없이 생활리듬도 그렇게 바뀌어가는 듯하다. 하는 일을 줄이면 괜찮을 텐데 새로운 일을 추가하지 않아도 이미 있는 일들만으로도 충분히 빡센 것도 문제인 듯.