<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nyan101 Blog</title>
    <description>블로그 설명은 어떻게 하지.
</description>
    <link>https://nyan101.github.io/</link>
    <atom:link href="https://nyan101.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 16 Jun 2025 01:17:36 +0900</pubDate>
    <lastBuildDate>Mon, 16 Jun 2025 01:17:36 +0900</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>7년 근속(?) 후 이직 후기</title>
        <description>&lt;p&gt;계속 “이직 후기 써야지…” 라고 생각만 하고 미루다가 결국 이직 1주차가 지난 지금에서야 작성하는 후기(?)&lt;/p&gt;

&lt;p&gt;사실 &lt;a href=&quot;https://nyan101.github.io/about/ko&quot;&gt;About&lt;/a&gt; 페이지나 그간의 대회 후기에서나 반쯤은 드러내놓고 써서 새삼스럽긴 하지만, 지난주, 정확히는 2025년 5월 31일을 기준으로 7년간의 군생활을 마치고 공군 대위에서 &lt;strong&gt;예비역&lt;/strong&gt; 공군 대위로 칭호가 바뀌었다. 전역하게 되면 뭔가 심정적으로도 크게 동요할 줄 알았는데 그새 1주일이 지나서인지 나름 익숙해진 것 같다. &lt;del&gt;올해부터 군 전직지원기간이 늘어서 지난 2월부터 출근 안 하고 거의 4개월 휴가를 보냈던 탓도 있는거같음&lt;/del&gt;&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2025/06/military-01.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;img src=&quot;/assets/images/2025/06/military-02.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;결론부터 말하면, 지난 6월 2일부터 쿼라(Quora)에서 Software Engineer로 일을 시작했다. 쿼라에 대한 소개는 &lt;a href=&quot;https://medium.com/@codetree_team/%EC%8B%A4%EB%A6%AC%EC%BD%98%EB%B0%B8%EB%A6%AC-%ED%9A%8C%EC%82%AC-%EB%8B%A4%EB%8B%88%EC%A7%80%EB%A7%8C-%ED%95%9C%EA%B5%AD%EC%97%90%EC%84%9C-%EC%9D%BC%ED%95%A9%EB%8B%88%EB%8B%A4-quora-%EC%BF%BC%EB%9D%BC-%EA%B0%9C%EB%B0%9C%EC%9E%90-1%ED%8E%B8-66c14c915df9&quot;&gt;잘 정리된 다른 글&lt;/a&gt;이 있어 이로 대체한다. 기본적으로 100% 재택근무에 원하는 경우 사당 공유오피스를 이용할 수 있다(출근하면 무료 간식/커피와 점심 식대가 지원된다). 지금은 본격적인 업무 시작 전 온보딩 과정중에 있어 회의/화상교육이 있을 때는 재택, 아닌 때는 오피스에 나와 다른 분들께 다양한 업무 관련 조언을 구하고 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2025/06/quora-offer.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;구직과정&quot;&gt;구직과정&lt;/h2&gt;

&lt;p&gt;전역을 앞두고 작년 말 ~ 올해 초부터 지원을 넣기 시작했고, 아래 차트에 정리한 과정을 거쳐 최종적으로 3개 회사에 합격했다. 3곳 모두 각각의 특색이 있는 곳이라 많은 고민을 했고, 고민 끝에 쿼라로의 이직을 결정했다. 삼성의 경우 차트를 만들 당시 서류통과 후 면접일정을 잡던 중이었는데, 결국 다른 곳들 결과가 모두 나온 후에야 일정이 나와 면접 전 중도포기 메일을 보내고 전형을 중지했다. 그밖에도 개발과 보안이라는 양쪽 분야에 모두 발을 걸친 만큼 관심있던 곳들은 많았지만 &lt;del&gt;시계 제작으로 유명한 모 공공기관을 포함해&lt;/del&gt; 공고 타이밍이 어긋나거나 다른 이런저런 사유들로 인해 모두 지원까지 이어지지는 못했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2025/06/stat.jpg&quot; style=&quot;width:95%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;군에서 7년간 사이버보안/개발업무를 수행했다보니 “군 경력”, “사이버보안 경력”, “개발경력” 이 혼재되어있어 회사마다, 혹은 직무마다 연차 인정 등에서 약간씩 차이를 보였다. 다만 요즘은 회사들도 일부 대기업을 제외하면 연차에 큰 의미를 두지 않는 경우가 많아 나 역시도 연차 인정에 크게 신경쓰지는 않았다. 앞서 설명한 삼성을 제외한 다른 곳들에 대해 내용이 짧은(=더 일찍 탈락한) 순서대로 간단한 후기를 정리했다. 아래 후기에서 코드만 제출하는 코딩테스트는 &lt;strong&gt;온라인 코딩테스트&lt;/strong&gt;로, 화면공유를 통해 실시간으로 설명을 진행하며 인터뷰어와 소통하는 방식의 인터뷰는 &lt;strong&gt;라이브 코딩테스트&lt;/strong&gt;로 구분해 작성했다.&lt;/p&gt;

&lt;h4 id=&quot;팔란티어palantir&quot;&gt;팔란티어(Palantir)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Forward Deployed Software Engineer&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: Recruiter Call 이후 &lt;span style=&quot;color: red;&quot;&gt;탈락&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;최근 매우 유명해진 곳으로, 정부나 기업 고객을 대상으로 고담(Gotham)과 파운드리(Foundry)라는 데이터 기반 온톨로지(Ontology) 플랫폼을 제공하는 회사이다. 작년 말 팔란티어 한국지사에서 FDSE 직무를 모집한다는 공고를 보고 온라인으로 지원했다. 간단한 업무경험과 개발, 사이버보안 관련 수상실적을 정리한 이력서를 제출했고 며칠 지나지 않아  Recruiter Call 관련 메일을 받을 수 있었다.&lt;/p&gt;

&lt;p&gt;Recruiter Call은 영어로 진행되었으며, 지원동기를 비롯해 15-20분 정도 대화를 진행했으나 며칠 후 불합격이라는 안내를 받았다. 개인적으로 업무경험(군 특수부서)도 그렇고 사이버보안, 알고리즘 양쪽 모두에서 나름대로 실적이 있어 “그래도 기술면접까지는 가지 않을까”라고 생각했기에 다소 충격적인 결과였지만 나중에 링크드인을 통해 현직자 커피챗을 진행한 결과 어느정도 결과를 받아들일 수 있었다.&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h4 id=&quot;프레스토랩스presto-labs&quot;&gt;프레스토랩스(Presto Labs)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Algorithmic Trader&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: 대면면접 이후 &lt;span style=&quot;color: red;&quot;&gt;탈락&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;싱가폴 기반의 퀀트 트레이딩 회사로, HFT(High-Frequency Trading, 고빈도매매)를 주력으로 한다. 자동화된 프로그램 매매 전략을 수립하고 이를 기반으로 가상자산, 증권 등에 투자해 수익을 내는 회사라고 할 수 있다. Algorithmic Trader 직무로 지원했으며, 온라인 코딩테스트 후 여의도 사무실에서의 대면면접이 잡혔다. 개인적으로는 온라인 코딩테스트를 진행했던 다른 두 곳(토스, 몰로코)에 비해 가장 난이도가 높았고, 온라인 코딩테스트와 함께 온라인 수학테스트(?)가 있다는 점이 신선했다.&lt;/p&gt;

&lt;p&gt;대면면접은 말 그대로 폭망했다(…) 면접장에 가니 A4용지와 펜이 준비되어 있었고, 일종의 수학 퍼즐 질문을 받은 후 그자리에서 풀이를 설명하는 식으로 진행되었다. 면접에 들어가기 전 어느정도 알고리즘 관련 문제나 혹은 수학 관련 라이브코딩을 예상했었기에 조금 당황했고, 주어진 질문들에 반 가까이 제대로 답하지 못하면서 탈락을 직감했다. 역시나 결과는 불합격이었고, 면접장을 나오는 순간 예상했던 결과라 담담히 받아들일 수 있었다. 비록 떨어졌지만 이런 스타일의 문제들을 평소에 꾸준히 접하는 것도 나름 재미있을 것 같다.&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h4 id=&quot;un개발계획undp&quot;&gt;UN개발계획(UNDP)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Digital Solutions Analyst (Fullstack Engineer)&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: 과제전형 중 일정 문제로 &lt;span style=&quot;color: orange;&quot;&gt;중도포기&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;우리가 아는 그 UN의 산하기관으로, 전 세계의 지속가능한 개발, 빈곤퇴치, 기후변화 대응 등을 지원하는 곳이다. SNS를 보던 중 “이런 공고도 있어?” 라는 생각에 좀더 찾아봤고, 생각보다 흥미로워 지원했다(UNDP 서울정책센터가 고려대에 있다는 걸 이때 처음 알았다). 직무 설명을 읽어보니 많은 업무들이 개별 프로젝트 단위로 이루어지고, 각각은 사실상 대시보드 생성이나 SI 업무라는 예상이 들었지만 그럼에도 불구하고 그 업무들 하나하나에서 큰 보람을 느낄 수 있겠다는 것이 느껴졌다. UNDP 서울정책센터의 최근 업무를 예로 들면&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;코소보의 디지털 부패 신고 시스템 개선&lt;/li&gt;
  &lt;li&gt;페루의 전통시장 디지털 전환 지원&lt;/li&gt;
  &lt;li&gt;코트디부아르 경찰청의 기술매개 젠더기반폭력(사이버성범죄) 대응역량 강화 지원&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;같은 것들이 있다. 살면서 한번쯤 해보고 싶은 업무였지만 직무 특성상 &lt;strong&gt;1년 계약직&lt;/strong&gt;이라는 한계가 계속 마음에 걸렸고, 이런 한계로 인해 결국 다른 곳들 면접일정과 과제전형이 겹치자 아쉬운 마음을 뒤로 한 채 중도포기를 결정했다.&lt;/p&gt;

&lt;p&gt;비록 중간에 포기했지만 과제전형 방식은 조금 신선했는데, &lt;strong&gt;AI 도구 사용을 권장하며 어떤 프롬프트를 사용했는지 명시할 것&lt;/strong&gt;이라는 조건 하에 간단한 대시보드가 포함된 풀스택 서비스를 템플릿 제공 없이 처음부터 구현하라는 내용이었다. 요즘 AI 도구의 발전으로 코딩테스트 무용론이 고개를 들고 있는데, 아예 이렇게 AI를 허용하는 대신 “어떻게 사용하는지”까지 함께 고려하는 것도 괜찮을 것 같다.&lt;/p&gt;

&lt;h4 id=&quot;몰로코moloco&quot;&gt;몰로코(Moloco)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Backend Software Engineer I/II&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: &lt;span style=&quot;color: orange;&quot;&gt;팀매칭 무산&lt;/span&gt;(25년도 1분기 TO 관련)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;머신러닝 기반 광고 자동화 플랫폼을 제공하는 실리콘밸리 기업으로, 한국지사가 상당히 큰 지분을 차지하고 있다. 한국에서는 &lt;strong&gt;몰두센&lt;/strong&gt;(몰로코, 두나무, 센드버드)이라는 약어의 한 축으로도 잘 알려져 있다. 처음 전형을 진행하기 앞서 인사팀에서 &lt;em&gt;“1분기에는 TO 문제가 있을 수 있는데, 2분기에 진행하는 것은 어떤지”&lt;/em&gt;라는 안내를 해줬지만, 지원한 다른 회사들과 일정을 맞추기 위해 1분기에 그대로 진행을 희망한다는 답변을 보냈다.&lt;/p&gt;

&lt;p&gt;온라인 코딩테스트의 난이도는 평이했고 약 15분만에 주어진 4문제를 모두 해결할 수 있었다. 며칠 후 진행된 라이브 코딩테스트에선 화면공유를 통해 내 풀이를 설명하면서 코딩을 진행했는데, 코드 작성 → 제출 → 채점결과 확인으로 이어지는 방식이 아닌 사실상 메모장에 가까운 환경에서 &lt;strong&gt;“왜 이렇게 코드를 작성했는지”&lt;/strong&gt;, &lt;strong&gt;“이 코드는 예시 입력이 들어왔을 때 어떻게 동작하는지”&lt;/strong&gt;, &lt;strong&gt;“내가 어떤 엣지 케이스를 고려했는지”&lt;/strong&gt;를 하나씩 설명하면서 진행하는 방식이었다.&lt;/p&gt;

&lt;p&gt;다만 코딩테스트 이후 팀매칭 단계에서 더 이상 진행되지는 않았는데, (문제는 나름 잘 해결했다고 생각했기에) 부족한 점에 대한 피드백을 요청한 결과 인터뷰 퍼포먼스의 문제가 아닌 해당 시점(25년 1분기) 기준 내가 지원한 레벨에 대한 TO가 닫힌 상황이라는 답변을 받았다. 처음엔 “조금 기다렸다가 2분기에 진행할 걸 그랬나”라는 생각도 했지만 2분기가 거의 끝난 지금까지도 Machine Learning 직무만 열리고 Backend 직무는 계속 닫혀있는 걸 보면 타이밍에 대한 아쉬움은 접어둬도 될 것 같다.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;여담으로 지인을 통해 처음 원서를 넣은 날이 12월 3일이었는데, 의도하진 않았지만 이로 인해 해당 지인에게 명확한 알리바이를 제시할 수 있었다(…)&lt;/del&gt;&lt;/p&gt;

&lt;h4 id=&quot;ey컨설팅ernst--young&quot;&gt;EY컨설팅(Ernst &amp;amp; Young)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Security Consultant&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: &lt;span style=&quot;color: green;&quot;&gt;합격&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;글로벌 회계 및 컨설팅 기업인 EY(Ernst &amp;amp; Young) 산하에서 전략, 디지털 전환, 리스크 관리를 비롯한 다양한 비즈니스 컨설팅을 제공하는 곳으로 흔히 빅4라고 불리는 글로벌 4대 회계법인(딜로이트, KPMG, PwC, EY)의 일원이다. 한국에서는 각각 딜로이트안진, 삼정KPMG, 삼일PwC, EY한영이라는 이름으로 국내 법인과 파트너십을 맺고있으며 이중 EY의 경우 현재로서는 유일하게 파트너 관계가 아닌 글로벌 본사에서 직접 지사를 운영하는 구조로 되어있다.&lt;/p&gt;

&lt;p&gt;링크드인을 통해 사이버보안 컨설턴트로의 제안을 받았고, 2-3차례의 면접을 거쳐 최종 합격안내를 받을 수 있었다. 처음 컨설팅이라는 단어만 들었을 때 “기술적으로 성장하기는 어렵지 않을까” 라는 우려를 했는데, 해당 부서에서 근무하시는 분께 직접 설명을 듣고 나자 해당 직무가 기술적으로도 상당히 흥미롭다는 인상과 함께 굉장히 많은 분야에 걸쳐 경험을 쌓을 수 있겠다는 생각이 들었다. 다만 개발자로서의 경험을 좀더 쌓아보고 싶다는 욕심이 남아 고민 끝에 아쉬운 마음으로 입사 거절메일을 보냈다. &lt;del&gt;보안업계가 워낙 좁다보니 얼마 전 세미나에서 이분을 다시 만나 조금 머쓱한 상황이 연출되기도 했다&lt;/del&gt;&lt;/p&gt;

&lt;h4 id=&quot;토스toss&quot;&gt;토스(toss)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Server Developer / Security Researcher&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: &lt;span style=&quot;color: green;&quot;&gt;합격&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;del&gt;토스가 어떤 회사인지에 대한 설명은 생략해도 된다고 믿는다&lt;/del&gt;. 작년 말 진행된 &lt;a href=&quot;https://toss.im/career/next-developer-2024&quot;&gt;토스 NEXT 개발자 챌린지&lt;/a&gt;를 통해 지원했다. 개발경력 3년(합산 3년 11개월) 미만이라는 제한이 있었기에 약간 애매했지만 &lt;em&gt;“비개발 이력을 제외하고 3년이면 기준을 만족한다”&lt;/em&gt;라는 안내가 있어 이력서에 기간별 직무에 대한 설명을 첨부하고 인사팀 판단에 따르기로 했다. 다행히 기준에 벗어나지는 않는다고 생각했는지 이후 코딩테스트, 면접까지 이어질 수 있었다.&lt;/p&gt;

&lt;p&gt;온라인 코딩테스트 이후 면접까지 이어졌고, 기술면접과 컬쳐핏 면접까지 끝난 후 Server Developer 직무에서 최종 합격안내를 받을 수 있었다. 입사까지 기간이 남아있어 처우 관련 협의를 진행했으나 당시 군인이라는 특성상 인사팀에서도 근거로 삼을 데이터가 적어 일부 난항을 겪었고, 그러던 중 보안팀에서 연락이 와 Security Researcher로의 재지원을 권유받았다. 개발과 보안 양쪽에 관심이 있었고, 설명을 들어본 후 보안팀에서 좀더 재미있게 일할 수 있을 것 같았기에 이를 진행했다.&lt;/p&gt;

&lt;p&gt;컬쳐핏 면접은 가치관에 대한 내용인 만큼 이미 Server Developer 지원에서 합격했기에 중복해서 다시 볼 필요는 없었지만, Security Researcher로 직무가 달라진 만큼 기술면접은 보안과 관련된 내용으로 다시 진행했다. 기술면접을 통과한 후 기존 Server Developer에서보다 조금 더 높아진 처우로 Security Researcher 합격안내를 받을 수 있었다.&lt;/p&gt;

&lt;p&gt;다음에 나올 쿼라와 함께 끝까지 고민했던 회사로, 마지막 거절메일을 보내는 순간까지 고민이 끊이지 않았다. 각 회사가 각자 장점이 뚜렷했고 하나가 다른 하나의 상위호환이 아닌 만큼 어느 쪽을 택해도 아쉬움이 남을 수밖에 없는 상황에서, 개발자로서 실리콘밸리 업무를 경험해보고 싶다는 생각과 다른 몇몇 이유들로 인해 최종적으로 쿼라로의 이직을 선택하게 되었다.&lt;/p&gt;

&lt;h4 id=&quot;쿼라quora&quot;&gt;쿼라(Quora)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;직무: Software Engineer&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;결과: &lt;span style=&quot;color: green;&quot;&gt;합격&lt;/span&gt;(최종 결정)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;영미권에서는 잘 알려진 &lt;a href=&quot;https://www.quora.com/&quot;&gt;Quora&lt;/a&gt;라는 QnA 커뮤니티와 상대적으로 최근 출시된 &lt;a href=&quot;https://poe.com/&quot;&gt;Poe&lt;/a&gt;라는 AI 챗봇 서비스를 개발하는 회사이다. 전세계 Full-Remote 제도를 운영하고 있어 100% 재택근무가 적용되며, 한국의 경우 사당에 공유오피스가 있어 자율 출퇴근이 가능하다. 직원들이 세계 곳곳에 퍼진 만큼 Coordination Hours는 본사인 미국 태평양 표준시에 맞춰져 있어 한국 기준 근무일은 화요일 ~ 토요일이 된다는 특징이 있다. 전체 인터뷰 과정은 마지막 하나를 제외하면 모두 영어로 진행되었다.&lt;/p&gt;

&lt;p&gt;Core Infrastructure 팀으로 지원했고, 서류 통과 후 Recruiter Call을 거쳐 라이브코딩 인터뷰를 진행했다. 라이브코딩은 몰로코에서와 유사하게 채점이 아닌 메모장에 가까운 형식이었으나, 쿼라에서는 내가 입력한 코드를 실행해보는(+면접관에게 이를 보여주면서 설명하는) 것까지는 가능한 환경이었다. “1초 내에 정답이 나오기만 하면 되는” 대부분의 알고리즘 코딩테스트와는 달리, 풀이를 제시하고 이를 코드로 구현한 후에도 &lt;em&gt;“조금 더 일반화할 수 있을까?”&lt;/em&gt;, &lt;em&gt;“혹시 (실행 시간에는 영향이 없지만) 메모리를 O(N)이 아닌 O(1)만 더 쓰는 풀이도 가능할까?”&lt;/em&gt; 같은 추가 질문들이 들어왔고 이를 모두 대답하자 두 번째 문제가 나왔다. 시간 문제로 두 번째 문제는 빠르게 풀이를 설명하고 코드를 작성했고, 며칠 후 통과했다는 메일을 받을 수 있었다.&lt;/p&gt;

&lt;p&gt;다음으로는 Language Practical Interview라는 조금은 독특한 방식의 인터뷰를 진행했다. 라이브코딩과 비슷하게 웹 IDE 화면을 공유하지만 빈 파일에서 시작하는 대신 이미 존재하는 프로젝트 코드베이스에서 시작해 제시된 추가 기능을 구현하는 방식으로, 주어진 프로젝트 폴더에서 &lt;strong&gt;“많은 코드파일 중 어떤 걸 봐야 하는지”&lt;/strong&gt;, &lt;strong&gt;“모든 코드를 전부 이해하지 않고도 핵심을 파악할 수 있는지”&lt;/strong&gt;, &lt;strong&gt;써보지 않은 라이브러리도 주변 코드나 에러메시지를 보고 적절히 활용할 수 있는지”&lt;/strong&gt; 와 같은 실무감각을 평가하는 데 좋은 방식이라는 인상을 받았다. 면접을 진행한 분도 &lt;em&gt;“실제로 task를 시간 내에 해결하는지 여부보다는 에러메시지를 보고 어떻게 대처하는지, 코드의 다른 함수를 보고 어떻게 참고하는지와 같은 사고과정을 본다”&lt;/em&gt; 라는 말을 하셨기에, 막혔을 때 가만히 고민하는 대신 내가 지금 코드의 어디를 보고 있는지 드래그로 표시하거나 코드 동작에 대해 내가 어떤 가설을 세우고 있는지 계속 설명하는 등 열심히 어필했고(?) 그게 어느정도 유효하게 작용했던 것 같다.&lt;/p&gt;

&lt;p&gt;Practical Interview를 진행한 같은 날 Engineering Value Interview와 Hiring Manager Interview가 이어서 진행되었다. 업무경험 관련 면접과 함께 일종의 컬쳐핏 면접이라고도 볼 수 있는데, 쿼라가 중요하게 생각하는 가치와 본인의 지난 업무경험을 어느정도 일치시킨 사례를 드는 식으로 진행되었다. 많은 한국인들이 그렇듯이 영어로 들어오는 질문은 모두 이해했고 그에 대해 답하고 싶은 내용도 있지만, 막상 영어로 말하려니 문장이 온전히 나오지 않을 때가 있어 조금 버벅거린 끝에 어찌저찌 마무리할 수 있었다. 마지막 Hiring Manager Interview는 한국어로 진행되었으며, 앞서와 비슷한 성격의 질문들이었지만 한국어로 진행된 만큼 말하고 싶은 내용들을 한층 편하게 표현할 수 있었다.&lt;/p&gt;

&lt;p&gt;이후 최종 합격 안내와 함께 오퍼레터를 받을 수 있었다.&lt;/p&gt;

&lt;h2 id=&quot;구직-외-근황&quot;&gt;구직 외 근황&lt;/h2&gt;

&lt;h4 id=&quot;이사&quot;&gt;이사&lt;/h4&gt;

&lt;p&gt;군에서 나오면서 가장 큰 고민은 역시 주거 문제였다. 이전까지 숙소를 제공해주던 직장에 있었다보니 자취 경험은 대학생 시절이 마지막이고, 대학생 시절에는 “학교까지 걸어서 O분 이내” 라는 거의 유일하다시피 한 조건으로도 후보군을 좁힐 수 있었지만 이제는 “어느 지역에 살것인지” 부터 결정해야 했기에 고민의 정도가 달라질 수밖에 없었다. 여러 앱을 다운받고 부동산을 들릴 때마다 군 숙소가 얼마나 큰 복지인지 새삼 체감할 수 있었다. &lt;del&gt;서울에서 침대 &amp;amp; 생활공간 포함된 숙소를 전기/가스 포함 월 O만원에 쓰다가 이젠 그 10배 이상을 낸다..&lt;/del&gt; 돌아다닌 끝에&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주변 생활시설&lt;/li&gt;
  &lt;li&gt;회사까지의 거리/교통편&lt;/li&gt;
  &lt;li&gt;방 퀄리티&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;셋 모두를 나름 만족하는 곳을 찾아 이사했다.&lt;/p&gt;

&lt;h4 id=&quot;화이트햇-스쿨whs-멘토-취임&quot;&gt;화이트햇 스쿨(WHS) 멘토 취임&lt;/h4&gt;

&lt;p&gt;올해부터 화이트햇 스쿨&lt;sup id=&quot;fnref:3&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;에서 멘토로 활동하고 있다. 나 스스로가 BoB 수료생이기도 하고 작년 DEFCON 출전도 BoB에서의 연이 이어져서 달성할 수 있었던 만큼, 멘토로 활동하면서 후배 멘티들에게도 좋은 영향을 끼칠 수 있도록 노력중이다. 전역 직후 새직장 온보딩과 기간이 맞물려 약간 바빠지긴 했지만 끝까지 좋은 결과로 이어지면 좋겠다.&lt;/p&gt;

&lt;hr /&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;자세한 설명은 어렵지만 내가 지원동기로 어필했던 사업부 특성상 (미국 기준) 외국인의 진입이 어려운 편이라고 추정된다. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;혹 관심있는 사람은 “Quant Math Puzzle” 같은 키워드로 검색해보면 예제를 찾을 수 있다. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;KITRI에서 BoB와 함께 운영하는 정보보안 인재양성 프로그램으로 &lt;a href=&quot;https://whitehatschool.kr/home/kor/main.do&quot;&gt;공식 홈페이지&lt;/a&gt;에서 자세한 내용을 확인할 수 있다. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sun, 08 Jun 2025 01:26:23 +0900</pubDate>
        <link>https://nyan101.github.io/blog/job-transition-after-7-years</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/job-transition-after-7-years</guid>
        
        <category>이직</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2024년도 대회 후기</title>
        <description>&lt;p&gt;올해는 알고리즘 대회 하나(메타 해커컵), AI 대회 하나(국방 AI 경진대회)를 제외하면 다 보안 관련 대회들이라 밸런스가 안 맞다는 이유로, 이것저것 다양하게 해서 &lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2023-review&quot;&gt;CTF 편&lt;/a&gt;, &lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2023-review&quot;&gt;PS/알고리즘 편&lt;/a&gt;, &lt;a href=&quot;https://nyan101.github.io/blog/others-in-2023-review&quot;&gt;기타 편&lt;/a&gt;을 따로 작성했던 2023년과는 달리 글 하나에 몰아 작성하기로 했다. &lt;del&gt;이제 나갈 수 있는 대회들이 점점 줄어간다…&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;defcon-ctf&quot;&gt;DEFCON CTF&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“살면서 데프콘 본선도 와보고…”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 8.7. ~ 14. (출국일정 기준)&lt;/li&gt;
  &lt;li&gt;주최/주관 : DEFCON Conference&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;세계 9위&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/DEFCON-qual-news.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/DEFCON-final-scoreboard.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;같은 직장 동기/후배들, BoB 지인들과 &lt;em&gt;Cold Fusion&lt;/em&gt; 이라는 이름으로 여러 CTF를 나갔고, 예선에서 다같이 힘을 합친 끝에 DEFCON 본선에도 진출했다. 한국에서 온라인으로 참가할지, 이왕 진출한거 미국까지 갈지 고민 끝에 개인 휴가를 털어가며 라스베가스행 비행기표를 끊었다. 약간의 우여곡절도 있었지만, 1인분을 했다고 자신있게 말하긴 어려워도 나름 문제풀이에 기여도 하면서 버스 탑승료 정도는 냈다고(?) 생각한다.&lt;/p&gt;

&lt;p&gt;매번 국내 대회만 나가면서 세계대회 본선 참가&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;는 처음 겪어보는데, 그래도 나름 보안 분야에서 일하면서 버킷리스트 하나는 이룬 것 같다. 자세한 후기에 대해서는 라스베가스 여행기와 합쳐 나중에 다시 글을 적어볼 생각이다. &lt;del&gt;아마도 언젠가는 쓰겠지&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;cce-사이버공격-방어대회&quot;&gt;CCE 사이버공격 방어대회&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“솔직히 2명이서 4등했으면 가산점 줘야하는거 아님??”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 8.3.(예선), 9.11.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 국가정보원 / 국가보안기술연구소&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;공공기관 4위&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/cce-banner.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;div style=&quot;width:80%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2024/12/cce-contest.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;img src=&quot;/assets/images/2024/12/cce-1.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/cce-scoreboard.png&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;작년에 이어 올해도 출전한 국정원 주관 해킹대회인 CCE이다. 군인 4명이서 팀을 꾸려 나갔는데, 부대 사정으로 2명이 본선 참가를 못 하게 되면서 2명이서 몸을 비틀어가며 대회를 진행했다. 올해는 CSK라는 국제 사이버훈련과 함께 진행되면서 대회 도중 VIP가 직접 방문하는 시간이 있기도 했고, 초반 2등까지 올라가면서 나름 기대를 했지만 결국 마지막 30분을 남겨두고 4등으로 떨어지면서 수상이 좌절됐다. 2022년에도 4등으로 아쉽게 수상하지 못한 적이 있었던 만큼, 3등까지 수상권인 대회에 4등만 두번 겪다보니 대회가 끝나고도 멘탈을 회복하는 데 시간이 좀 걸렸다(…)&lt;/p&gt;

&lt;h2 id=&quot;화이트햇-콘테스트&quot;&gt;화이트햇 콘테스트&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“다행히 여기선 3등함”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 10.19.(예선), 11.19.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 국방부 / 사이버작전사령부&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;간부트랙 3위(사이버작전사령관상)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/whitehat-banner.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;div style=&quot;width:80%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2024/12/whitehat-main.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;img src=&quot;/assets/images/2024/12/whitehat-award.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;사이버사령부에서 주관하는 CTF이다. 올해는 일반부가 없어진 대신 청소년 / 군(용사) / 군(간부)의 3가지 트랙으로 변경되면서 상금이 늘어났다. CCE 때와는 달리 4명 팀으로 무사히(?) 본선까지 참가할 수 있었고, 마지막에 조금 아슬아슬했지만 다행히 최종 3위로 수상권에 들 수 있었다. 2024년 마지막 사이버보안 관련 대회였는데 다행히 나름의 성과를 거두며 마무리할 수 있어 만족스러운 대회였다.&lt;/p&gt;

&lt;h2 id=&quot;maicon-국방-ai-경진대회&quot;&gt;MAICON 국방 AI 경진대회&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“이제 국방해커톤 대신 AI 대회 합니다”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 11.27. ~ 29.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 국방부 / 국방오픈소스아카데미&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;우수상(공군참모총장상)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;width:80%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2024/12/maicon-main.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;img src=&quot;/assets/images/2024/12/maicon-award.jpg&quot; style=&quot;width:49%&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;기존 국방 해커톤이 더 이상 열리지 않고 예산을 국방 AI 경진대회에 올인한 모양이다. 예선은 코딩테스트였는데 일반적인 알고리즘 방식의 문제가 아니라 pandas, pytorch를 다루는 문제가 나왔고, 이를 통과한 사람들끼리 5인 팀을 꾸려 본선에 참가하는 방식이었다. 본선은 주어진 자율주행 로봇을 코딩해 주어진 미션(피아인식, 적외선 레이저 발사)을 수행하는 방식으로, 처음 겪어보는 방식이었지만 세트장 구성이나 진행방식 등 여러모로 신경을 쓴 게 느껴지는 대회였다.&lt;/p&gt;

&lt;p&gt;본선 주행 기회가 2번밖에 주어지지 않는 점이 약간 아쉬웠는데, 나름 준비가 철저하다고 생각했음에도 첫 주행에서 미스가 나는 바람에 두 번째 주행에서 간절한 마음으로 미션 성공을 기도했다. 결과적으로 우수상을 받긴 했지만 1등과의 차이가 얼마 나지 않는 만큼 만족스러움과 아쉬움이 함께하는 대회였다. &lt;del&gt;20대 초반 용사들은 밤샘도 잘 하던데 30살 넘은 대위들한테 밤샘 두번은 좀 힘들긴 했음&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;메타-해커컵&quot;&gt;메타 해커컵&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“보급티셔츠(?) 하나 더 추가”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 메타(Meta)&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;Round 2 진출 + 티셔츠 획득&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2024/12/hackercup-certificate.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;페이스북 운영사인 메타(Meta)에서 주관하는 프로그래밍 대회이다. Round 1에서 World Final까지 총 5단계로 이뤄지며, 각 라운드의 진출요건은 다음과 같다. &lt;del&gt;어딘가 익숙한 느낌이 든다면 2023년도 설명 복붙 맞습니다&lt;/del&gt;. 올해는 기존의 대회를 &lt;em&gt;Human Track&lt;/em&gt; 으로, NeurIPS 학회와 함께 AI가 전체 코드를 작성하는 별도의 트랙을 &lt;em&gt;AI Track&lt;/em&gt; 으로 구분해 진행했다. 대회 당시만 해도 AI가 점차 성능이 좋아지는 걸 느꼈는데, 이 글을 쓰는 12월에는 GPT o3가 코드포스 기준 2727점을 달성했다는 소식이 나왔다. 과연 인간 코더의 설 자리는…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Round 1
    &lt;ul&gt;
      &lt;li&gt;절대평가로 참가자들 중 상위 5000명이 Round 3에 진출&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;585위&lt;/strong&gt;로 Round 2 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 2
    &lt;ul&gt;
      &lt;li&gt;Round 2 참가자들 중 상위 500명이 Round 3에 진출&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;1문제 이상을 해결한 상위 2000명의 참가자들에게 티셔츠 제공&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;859위&lt;/strong&gt;로 마감&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 3
    &lt;ul&gt;
      &lt;li&gt;Round 3 참가자들 중 상위 25명이 World Final에 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;결과적으로 올해도 티셔츠를 얻는 데 성공했다. 작년이랑 거의 동일한 디자인에 색조만 살짝 옅어진 형태로 소매의 Meta 까지 동일하다.&lt;/p&gt;

&lt;p&gt;어느새 2025 전역의 해가 밝았다. 어떻게 보면 지금까지는 주어진 틀 안에서 객관식의 선택지&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;가 주어졌다면, 이젠 진로에 대해 주관식으로 답안을 써 내야 하는 만큼 여러 고민을 하는 중이다.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;세계대회 본선에 진출했어도 참가하지 못한 [검열됨]같은 대회는 있지만… &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;그나마도 선택권이 항상 주어지지는 않는 &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 31 Dec 2024 11:58:42 +0900</pubDate>
        <link>https://nyan101.github.io/blog/contests-in-2024-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/contests-in-2024-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2023년도 후기 - 기타(ETC) 편</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2023-review&quot;&gt;CTF 같은 해킹대회&lt;/a&gt;나 &lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2023-review&quot;&gt;PS 알고리즘 대회&lt;/a&gt;는 아니지만, 소소한 다른 것들을 정리할 포스트도 필요하다고 생각해 따로 작성했다. &lt;del&gt;막상 제대로 적을 건 둘밖에 없긴 하지만&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;정보보안기사-자격증-취득&quot;&gt;정보보안기사 자격증 취득&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“3트만에 결국…! 이제 쌍기사입니다”&lt;/em&gt;&lt;/p&gt;

&lt;div style=&quot;width:80%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2023/12/security-knight-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2023/12/security-knight-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;올해 5월 정보보안기사 실기에 합격해 보안기사 자격증을 취득했다. 작년 필기에 합격하고 실기를 떨어졌었는데, 5월에 응시한 실기시험의 서술형 항목으로 SQL injection과 같이 &lt;del&gt;날로 먹을 수 있는&lt;/del&gt; 익숙한 분야에서의 고배점 문항이 출제되어 합격의 기쁨을 얻을 수 있었다.&lt;/p&gt;

&lt;p&gt;+ 이제 정보처리기사, 정보보안기사 둘 다 있으니 Information Knight 드립 칠 수 있다(?)&lt;/p&gt;

&lt;h2 id=&quot;toeic-어학성적-취득&quot;&gt;TOEIC 어학성적 취득&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“말해보카와 넷플릭스에 이 영광을 바칩니다”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/toeic-score.jpg&quot; style=&quot;width:55%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;7월 말 토익시험을 봤다. 이전에 본 성적이 2년이 지나 만료되기도 했고, 당시 말해보카라는 영어공부 앱을 설치해 한창 사용하던 시기여서 한번쯤 영어 어학시험을 다시 봐야겠다는 생각을 했었다. 어차피 군인할인 적용하면 응시료도 반값이다보니 치킨 1마리 값으로 응시할 수 있었는데, 생각보다 높은 점수가 나와 한동안 혼자 뿌듯해했던 기억이 있다.&lt;/p&gt;

&lt;h2 id=&quot;기타&quot;&gt;기타&lt;/h2&gt;
&lt;p&gt;사실 이외에도 직장에서 받은 업무 관련 표창장이나 교육우수 상장, 우수제안 수상 등 소소한 성과들이 있지만 아무래도 공개된 장소에 올리기엔 조금 어려운 내용들이다보니 아쉬움이 있다. 이제 전역도 1년 반 정도밖에 남지 않았는데 앞으로 남은 기간 &lt;del&gt;연구도 좀 하고&lt;/del&gt; 열심히 준비해야겠다.&lt;/p&gt;

&lt;hr /&gt;

</description>
        <pubDate>Sun, 31 Dec 2023 00:37:02 +0900</pubDate>
        <link>https://nyan101.github.io/blog/others-in-2023-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/others-in-2023-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2023년도 대회 후기 - 알고리즘(PS) 편</title>
        <description>&lt;p&gt;2023년 올해도 &lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2023-review&quot;&gt;CTF 편&lt;/a&gt;에 이은 알고리즘(PS) 편이다. 올해는 &lt;del&gt;페이스북&lt;/del&gt; 메타 해커컵 티셔츠, SCPC 성불 모두 이룬 나름 의미있는 해였다.&lt;/p&gt;

&lt;h2 id=&quot;구글-코드잼google-code-jam&quot;&gt;구글 코드잼(Google Code Jam)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“이제는 역사의 흔적이 되어버린…”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 구글(Google)&lt;/li&gt;
  &lt;li&gt;결과 : &lt;del&gt;운영 종료&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/06/farewell-CodeJam.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;매년 구글에서 진행&lt;del&gt;하는&lt;/del&gt;했던 프로그래밍 대회이다. &lt;a href=&quot;https://nyan101.github.io/blog/farewell-codejam&quot;&gt;지난 글&lt;/a&gt;에서 썼듯이, 올해부터는 더 이상 열리지 않는다.&lt;/p&gt;

&lt;h2 id=&quot;메타-해커컵meta-hacker-cup&quot;&gt;메타 해커컵(Meta Hacker Cup)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“올해 티셔츠는 구글 대신 메타에서 받았습니다”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 메타(Meta)&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;Round 2 진출 + 티셔츠 획득&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/hackercup-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;페이스북 운영사인 메타(Meta)에서 주관하는 프로그래밍 대회이다. Round 1에서 World Final까지 총 5단계로 이뤄지며, 각 라운드의 진출요건은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Practice Round
    &lt;ul&gt;
      &lt;li&gt;이전 Qualification Round와 달리, 대회에 영향을 주지 않는 연습 라운드이다.&lt;/li&gt;
      &lt;li&gt;결과 : 미참가&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 1
    &lt;ul&gt;
      &lt;li&gt;절대평가로 &lt;del&gt;일정 점수 이상을 해결하면 Round 1로 진출&lt;/del&gt; 1문제 이상을 해결하면 Round 1 진출&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;44/100&lt;/strong&gt;으로 Round 2 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 2
    &lt;ul&gt;
      &lt;li&gt;Round 2 참가자들 중 상위 500명이 Round 3에 진출&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;1문제 이상을 해결한 상위 2000명의 참가자들에게 티셔츠 제공&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;768위&lt;/strong&gt;로 마감&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 3
    &lt;ul&gt;
      &lt;li&gt;Round 3 참가자들 중 상위 25명이 World Final에 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;World Final
    &lt;ul&gt;
      &lt;li&gt;천상계(…)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/hackercup-certificate.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;올해는 코드잼도 없어 이번에야말로 해커컵 티셔츠를 받겠다는 마음으로 대회에 참가했다. Round 1 진행 중 갑자기 답안 제출이 안 되는 문제가 발생했고, 빠르게 SNS를 열어보니 나뿐만이 아닌 많은 사람들이 동일한 문제를 겪고있다는 걸 확인할 수 있었다. 한밤중이었던 만큼 &lt;em&gt;“서버 오류면 다음에 다시 하던지 따로 공지를 올려주겠지”&lt;/em&gt;라는 생각으로 자러 들어갔고, 결과적으로 한 문제 이상 푼 사람 모두를 Round 2로 진출시키겠다는 공지가 올라왔다.&lt;/p&gt;

&lt;p&gt;그렇게 Round 2 대회날이 다가왔고, &lt;del&gt;나와 해커컵 사이의 유구한 역사에 따라&lt;/del&gt; 올해도 다른 일정과 겹쳤다(…) 데이트 약속이 있던 날로, 데이트가 끝난 후 들고 간 노트북을 이용해 대회에 참여했다. 대회를 진행하면서 “좀더 해서 Round 3 진출을 노려볼까…” 라는 생각도 들었으나, 피로가 누적된 몸은 &lt;em&gt;“World Final이 아니면 어차피 티셔츠 하나 받는 건 똑같지 않나?”&lt;/em&gt;라는 마음속 속삭임과 타협해 적당한 선에서 잠을 청했다.&lt;/p&gt;

&lt;p&gt;결국 티셔츠 등수(2,000등)와 Round 3 진출등수(500등) 사이인 768등으로 마감했고, 티셔츠를 받았다. &lt;a href=&quot;https://nyan101.github.io/blog/facebook-hackercup-2020-review&quot;&gt;예전 티셔츠&lt;/a&gt;와 거의 동일한 디자인이지만 이번엔 어깨에 &lt;strong&gt;FACEBOOK&lt;/strong&gt;이 아닌 &lt;strong&gt;∞ Meta&lt;/strong&gt;라고 적혀있다는 차이가 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/hackercup-tshirt.jpg&quot; style=&quot;width:85%; border:1px solid black&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;woori-코딩-페스티벌-성인부&quot;&gt;Woori 코딩 페스티벌 성인부&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“시상식에서 열린 의문의 동문회(?)”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 5.13.(예선), 5.27.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 우리FIS&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;장려상(언어별 3~4위)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/woori-coding-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;우리FIS에서 진행한 코딩대회로 YBM센터에서 대회를 진행했다는 게 인상적이었다. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Java&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Python&lt;/code&gt;의 세 가지 언어 중 하나를 택해 응시할 수 있었으며, 개인적으로 익숙한 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Python&lt;/code&gt;을 선택했다. 각 언어별로 1~4등까지 총 12명에게 상장과 상금이 제공되는 비교적 작은 규모로 진행되었다.&lt;/p&gt;

&lt;p&gt;언어별 구분을 해 실질적으로 1~4등까지만 수상 가능한데다가, 대회 중에는 제출한 코드의 정답 여부를 알려주지 않다보니 결과를 예상할 수 없는 대회였다. 그랬던 만큼 &lt;em&gt;“어차피 4등 안에 못 들면 5등이나 100등이나 차이 없는 거 아닌가?”&lt;/em&gt;라는 생각과 함께 약간의 도박을 했고&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, 어느 정도 통했는지 장려상을 수상했다는 말을 들을 수 있었다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2023/12/woori-coding-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2023/12/woori-coding-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;시상식에서 해군 대위로 복무중인 대학 1년 선배를 만났다. 둘 모두 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Python&lt;/code&gt;을 선택했는데 선배가 우수상, 내가 장려상으로 1~4위 중 현역 군인이 2명이라는 &lt;del&gt;수상자 대상 입사설명회를 준비한 우리FIS로서는 아쉽게도&lt;/del&gt; 인상적인 결과였다.&lt;/p&gt;

&lt;h2 id=&quot;삼성-대학원생-프로그래밍-경진대회scpc&quot;&gt;삼성 대학(원)생 프로그래밍 경진대회(SCPC)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“기나긴 여정 끝에 수상 2회 달성”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 5.13.(예선), 5.27.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 삼성전자&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;5등상&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2020/11/scpc-01.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/SCPC-2017-review&quot;&gt;학부 시절&lt;/a&gt;부터 매년 참가하는 대회로, 국내 알고리즘 대회 중에서는 ICPC에 버금가는 인지도를 가진 대회이다. 매년 본선에 꾸준히 진출하면서도 막상 수상에선 아쉽게 미끄러지곤 했는데, 올해는 5등상으로 대회를 마무리할 수 있었다.&lt;/p&gt;

&lt;p&gt;올해에도 대회가 끝나고서야 발견한 실수들이 있어 &lt;em&gt;“올해도 수상은 내년을 기약해야 하나…”&lt;/em&gt; 라며 아쉬워했는데, 5등상이라는 결과를 받으니 뭔가 생각지도 못한 선물을 받은 기분이다.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;그런데 이러면 “실수만 안했으면 4등상이었던거 아니야?” 라는 생각이 드는 게 또 사람 마음이다.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2023/12/scpc-scoreboard.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;온라인으로 진행된 만큼 상장과 상패는 택배를 통해 따로 전달되었다. 이제 수상 2회를 달성해 현대모비스 대회에 이어 SCPC도 더이상 못 나간다(…)&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2023/12/scpc-award-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2023/12/scpc-award-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Round 1 진행 중, 서버 오류가 생기면서 양수 점수를 얻은 사람 모두를 Round 2로 진출시켰다(…) &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;거창하게 썼지만, 그냥 코드 검토 없이 스스로를 믿고(?) 초안 작성하자마자 바로 제출버튼 눌렀다는 뜻이다(…) &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sat, 30 Dec 2023 22:18:47 +0900</pubDate>
        <link>https://nyan101.github.io/blog/PS-contests-in-2023-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/PS-contests-in-2023-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2023년도 대회 후기 - 해킹(CTF) 편</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2022-review&quot;&gt;작년에 이어&lt;/a&gt; 올해도 대회는 꾸준히 나갔지만 후기는 연말에 몰아서 쓰게 됐다(…)&lt;/p&gt;

&lt;p&gt;올해는 작년과 달리 4인 CTF뿐만이 아니라, 사이버보안 해커톤, 온라인 국제대회 등 다양한 종류의 대회에 나가보았다.&lt;/p&gt;

&lt;h2 id=&quot;cce-사이버공격-방어대회&quot;&gt;CCE 사이버공격 방어대회&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 6.10.(예선), 7.12.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 국가정보원 / 국가보안기술연구소&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;공공기관 7위&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/cce-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;국가정보원에서 주관하는 CTF로 일반인들을 위한 일반분야와 공공기관 종사자들을 위한 공공분야로 나눠 진행된다. 예선은 일반적인 Jeopardy(문제풀이) 방식, 본선은 Jeopardy와 함께 공격받는 Live 서버를 실시간으로 방어하는 방식으로 진행되었다. &lt;del&gt;작년이랑 설명이 똑같은 것 같다고요? 기분 탓입니다&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;본선은 서울 롯데호텔에서 진행되었다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2023/12/cce-contest-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2023/12/cce-contest-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;4인 대회에 3인 팀을 구성해 나간 만큼 &lt;del&gt;다양한 다과와 퀄리티 높은 식사를&lt;/del&gt;대회의 분위기를 즐기는 데 집중했다. 그렇게 일부 문제를 해결했지만 약간의 아쉬움과 함께 공공분야 7등이라는 성적으로 대회를 마칠 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/cce-scoreboard.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;화이트햇-콘테스트&quot;&gt;화이트햇 콘테스트&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 9.16.(예선), 10.26.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 대한민국 국방부 / 사이버작전사령부&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;참가에 의의를(…)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/whitehat-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;사이버작전사령부에서 주관하는 CTF로 &lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2022-review&quot;&gt;작년&lt;/a&gt;에 국방트랙 2등을 했던 대회이다. 올해는 화이트햇 예선과 SCPC(삼성 대학생/대학원생 프로그래밍 경진대회) 본선이 겹치면서 예선 문제를 구경하는 데 의의를 뒀다. &lt;del&gt;그래도 SCPC는 5등상 받았으니 만족합니다&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;ctfzone&quot;&gt;CTFZone&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;일시 : 8.12.(예선), 11.25.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : BI.ZONE(러시아 보안업체)&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;국제 8위&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;러시아 보안업체인 BI.ZONE에서 운영하는 국제 CTF 대회이다. 올해 BoB 멘토님과 함께 현직 군 소속 인원들끼리 &lt;strong&gt;Call of Duty&lt;/strong&gt;라는 CTF 팀을 구성해 이런저런 CTF들에 참가해오고 있었는데, 그중 본선까지 진출해 괜찮은 실적을 냈던 대회이다.&lt;/p&gt;

&lt;p&gt;훌륭한 팀원들의 버스에 실려 예선 4위라는 성적으로 본선에 진출했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/ctfzone-qual-scoreboard.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;국제대회인 만큼 본선 역시 온라인으로 진행되었으며, 가산 BoB센터에 모여 밤샘 대회를 진행했다. 최종 8위로 대회를 마쳤다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/ctfzone-final-scoreboard.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;군-사이버보안-전문인력-양성-해커톤&quot;&gt;군 사이버보안 전문인력 양성 해커톤&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;일시 : 12.9.&lt;/li&gt;
  &lt;li&gt;주최/주관 : 대한민국 국방부, 과학기술정보통신부 / 한국인터넷진흥원(KISA)&lt;/li&gt;
  &lt;li&gt;결과 : &lt;strong&gt;최우수(1위)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;국방부, 과학기술정보통신부에서 주최한 군 사이버보안 전문인력(사이버탈피오트) 양성 해커톤이다. &lt;del&gt;이제는 익숙해진&lt;/del&gt; 사이버 탈피오트라는 슬로건을 내걸고 상당히 큰 규모의 상금이 함께한 대회였다.&lt;/p&gt;

&lt;p&gt;기획서로 평가하는 예선과 현장에서 시제품을 완성해 발표하는 본선으로, 진행되었으며 동기, 후배들과 함께 5인 팀을 구성해 나갔다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2023/12/cybertalpiot-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2023/12/cybertalpiot-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;개발시간이 한정된 만큼 AI나 블록체인 대신 현실성에 집중해 아이디어를 냈는데, 발표에서 이런 부분을 강조했던 점이 높은 점수를 받았는지 최종 1위라는 높은 성적을 받을 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/cybertalpiot-03.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;대회를 마친 다음주, COEX에서 시상식과 함께 군 사이버전문인력 양성 세미나가 진행되었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/12/cybertalpiot-04.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

</description>
        <pubDate>Sat, 30 Dec 2023 20:19:31 +0900</pubDate>
        <link>https://nyan101.github.io/blog/CTF-contests-in-2023-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/CTF-contests-in-2023-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>구글, &quot;코드잼 서비스를 종료합니다&quot;</title>
        <description>&lt;p&gt;매년 참가해오던 &lt;a href=&quot;https://codingcompetitions.withgoogle.com/codejam&quot;&gt;구글 코드잼&lt;/a&gt;이 올해를 끝으로 더 이상 운영되지 않는다는 공지를 내걸었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/06/farewell-CodeJam.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;전역까지 매년 티셔츠 모으려고 했는데ㅠ&lt;/del&gt; 들리는 소문에 따르면 구글 코드잼 운영부서가 통으로 구조조정당했다는 말이 있던데… 코드잼과 함께 킥스타트, 해시코드 같은 다양한 대회들도 함께 종료되면서 매년 해오던 연례행사가 하나 사라진 기분이다. 되돌아보니 거의 5,6년간 해오던 대회였던 만큼 기록이 사라지기 전에 백업해두기로 했다.&lt;/p&gt;

&lt;h2 id=&quot;구글-코드잼google-code-jam&quot;&gt;구글 코드잼(Google Code Jam)&lt;/h2&gt;

&lt;p&gt;대학교 3학년이던 2016년부터 시작해 군 훈련소에 있던 2018년을 제외하면 매년 참가했다. 처음엔 라운드 3 진출도 못 하다가 대학 졸업 이후(2019) 부터는 매년 티셔츠를 받아오는 데 성공했다. 전역까지 티셔츠만 7벌 모으고 싶었는데 이번 일로 4벌에서 단종되면서 도전과제가 강제 종료됐다..&lt;/p&gt;

&lt;h3 id=&quot;2016년&quot;&gt;2016년&lt;/h3&gt;
&lt;p&gt;첫 참가이다. Qual라운드, Round 1까지 진출하고 2도 못 갔었다. &lt;del&gt;뉴비 시절&lt;/del&gt;
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2016.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2017년&quot;&gt;2017년&lt;/h3&gt;
&lt;p&gt;마찬가지로 Round 1까지 기록이 있다. 등수로 보면 Round 2는 갔을거같은데 왜 안봤었는지는 모르겠다.
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2017.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2018년&quot;&gt;2018년&lt;/h3&gt;
&lt;p&gt;민간인 → 소위 전직퀘스트 중이어서 참가 못함&lt;/p&gt;

&lt;h3 id=&quot;2019년&quot;&gt;2019년&lt;/h3&gt;
&lt;p&gt;첫 티셔츠를 얻은 대회이다. 처음인 만큼 기쁜 마음에 &lt;a href=&quot;https://nyan101.github.io/blog/Google-CodeJam-2019-review&quot;&gt;후기 글&lt;/a&gt;도 작성했었다.
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2019.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2020년&quot;&gt;2020년&lt;/h3&gt;
&lt;p&gt;두 번째 티셔츠를 얻은 대회이다. 이 때도 &lt;a href=&quot;https://nyan101.github.io/blog/Google-CodeJam-2020-review&quot;&gt;후기 글&lt;/a&gt;은 작성했다.
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2020.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2021년&quot;&gt;2021년&lt;/h3&gt;
&lt;p&gt;세 번째 티셔츠라 그런지 슬슬 &lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2021-review&quot;&gt;후기&lt;/a&gt;에서도 배가 부른 모습을 보여준다(…)
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2021.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2022년&quot;&gt;2022년&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2022-review&quot;&gt;이 글&lt;/a&gt;이 마지막이 될 줄은 몰랐는데…
&lt;img src=&quot;/assets/images/2023/06/CodeJam-2022.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;구글-킥스타트google-kickstart&quot;&gt;구글 킥스타트(Google KickStart)&lt;/h2&gt;

&lt;p&gt;킥스타트는 2017년부터 참가헀다. 일정으로 인해 매번 참가하지는 못했지만, 가끔 좋은 결과를 얻었을 때 실제로 구글로부터 채용 관련 메일이 오는 등&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 여러 신기한 경험이 함께했던 대회였다.&lt;/p&gt;

&lt;h3 id=&quot;2017년-1&quot;&gt;2017년&lt;/h3&gt;
&lt;p&gt;첫 참가에서 운이 좋았는지 15등을 하고 채용 메일을 받았다. 이 때는 군필이 아니어서 눈물을 머금고 거절메일을 작성했다.
&lt;img src=&quot;/assets/images/2023/06/KickStart-2017.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;20182022년&quot;&gt;2018~2022년&lt;/h3&gt;
&lt;p&gt;슬슬 귀찮아지니 그냥 사진만 올리는 걸로(…)
&lt;img src=&quot;/assets/images/2023/06/KickStart-2018.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/06/KickStart-2019.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/06/KickStart-2021.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2023/06/KickStart-2022.png&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이제 나갈만한 글로벌 대기업 대회는 &lt;del&gt;페이스북&lt;/del&gt;메타 해커컵 정도인데, 매년 참가는 하겠지만 굳이 준비를 따로 할것같진 않다.&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;em&gt;한국 국적 남성이실 경우 군필, 또는 면제이셔야 합니다&lt;/em&gt; 라는 조건이 붙어있어 실제 채용까지 이어지지는 못함 &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 06 Jun 2023 03:22:54 +0900</pubDate>
        <link>https://nyan101.github.io/blog/farewell-codejam</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/farewell-codejam</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2022년도 대회 후기 - 알고리즘(PS) 편</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2022-review&quot;&gt;2022년도 대회 후기 - 해킹(CTF) 편&lt;/a&gt;에 이은 알고리즘(PS) 편이다. &lt;del&gt;어떻게 2023년 오기 전에 다 쓰기는 하네&lt;/del&gt; 현대모비스 대회에서 예상치 못한 소득(feat. 500만원)과 함께 공군해커톤 등 나름 성과가 있었고, 올해도 SCPC 성불은 하지 못했다(…)&lt;/p&gt;

&lt;p&gt;예선/본선 일자가 명확했던 CTF와 달리 이번에는 기간을 두고 진행한 온라인 대회들이 많아 일시는 생략했다.&lt;/p&gt;

&lt;h2 id=&quot;구글-코드잼google-code-jam&quot;&gt;구글 코드잼(Google Code Jam)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“이제 코드잼 티셔츠만 4장(2019, 2020, 2021, 2022)이 되었습니다”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 구글(Google)&lt;/li&gt;
  &lt;li&gt;결과 : Round 3 진출&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/codejam-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;매년 구글에서 진행하는 프로그래밍 대회이다. Qualification Round → Round 1 → Round 2 → Round 3 → World Final까지 총 5단계로 이뤄지며, 각 라운드의 진출요건은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Qualification Round
    &lt;ul&gt;
      &lt;li&gt;절대평가로 30점 이상의 점수를 얻으면 Round 1로 진출&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;71/100&lt;/strong&gt;으로 Round 1 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 1
    &lt;ul&gt;
      &lt;li&gt;3개의 라운드(1A, 1B, 1C) 중 하나에서 1500위 이상을 달성하면 Round 2로 진출&lt;/li&gt;
      &lt;li&gt;결과 : Round 1A에서 &lt;strong&gt;357위&lt;/strong&gt;로 Round 2 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 2
    &lt;ul&gt;
      &lt;li&gt;Round 2 참가자들 중 상위 1000명이 Round 3에 진출&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;502위&lt;/strong&gt;로 Round 3 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 3
    &lt;ul&gt;
      &lt;li&gt;Round 3 참가자들 중 상위 25명이 World Final에 진출&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Round 3 진출자 전원에게 코드잼 티셔츠 증정&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;결과 : 최종 &lt;strong&gt;459위&lt;/strong&gt;로 종료&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;World Final
    &lt;ul&gt;
      &lt;li&gt;&lt;del&gt;여긴 논외로 치자&lt;/del&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;실력 유지를 위한 암묵적인 선으로 Round 3 상위 500명 이내를 목표로 잡았는데, &lt;a href=&quot;https://nyan101.github.io/blog/Google-CodeJam-2019-review&quot;&gt;2019년&lt;/a&gt;, &lt;a href=&quot;https://nyan101.github.io/blog/Google-CodeJam-2020-review&quot;&gt;2020년&lt;/a&gt;, &lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2021-review&quot;&gt;2021년&lt;/a&gt;에 이어 올해도 목표를 달성해 새 티셔츠를 얻을 수 있었다.&lt;/p&gt;

&lt;h2 id=&quot;페이스북메타-해커컵meta-hacker-cup&quot;&gt;&lt;del&gt;페이스북&lt;/del&gt;메타 해커컵(Meta Hacker Cup)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“이상하게 해커컵 티셔츠랑은 연이 안 이어지네요…”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : &lt;del&gt;페이스북(Facebook)&lt;/del&gt; 메타(Meta)&lt;/li&gt;
  &lt;li&gt;결과 : Round 2 진출 &lt;del&gt;이번에도 티셔츠는 못 받았다&lt;/del&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/hackercup-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이제 주관사 명칭이 바뀐(?) 프로그래밍 대회이다. 코드잼과 유사하게 Qualification Round에서 World Final까지 총 5단계로 이뤄지며, 각 라운드의 진출요건은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Qualification Round
    &lt;ul&gt;
      &lt;li&gt;절대평가로 1문제 이상을 해결하면 Round 1로 진출&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;50/100&lt;/strong&gt;으로 Round 1 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 1
    &lt;ul&gt;
      &lt;li&gt;절대평가로 24점 이상의 점수를 얻으면 Round 2로 진출&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;40/100&lt;/strong&gt;으로 Round 1 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 2
    &lt;ul&gt;
      &lt;li&gt;Round 2 참가자들 중 상위 500명이 Round 3에 진출&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;1문제 이상을 해결한 상위 2000명의 참가자들에게 티셔츠 제공&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;결과 : &lt;strong&gt;2817위&lt;/strong&gt;로 마감&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Round 3
    &lt;ul&gt;
      &lt;li&gt;Round 3 참가자들 중 상위 25명이 World Final에 진출&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;World Final
    &lt;ul&gt;
      &lt;li&gt;코드잼과 동일&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;작년에는 자느라 못 했지만 이번에는 티셔츠를 받겠다는 마음으로 졸린 몸을 이끌었다. 어떻게 한문제만 풀면 티셔츠를 받을 수 있겠다는 계산에 A번 문제를 풀고 다시 잠들었고, 대회 종료 후 결과를 보니 Small만 통과하고 Large 케이스에서 오답 판정이 나왔다(…) 공식 풀이와 모든 면에서 동일했지만 해시함수를 만들기 귀찮은 나머지 삼각함수($sin(x)$)를 이용해 간단히 만들었는데, 작은 값에서 가까운 $sin(x)$ 값들끼리 서로 유사한 결과를 내게 되면서 해시 충돌이 발생했던 것이다. 커스텀 해시함수 부분만 고치면 바로 정답이 되는 코드여서 더 아쉬웠다. &lt;del&gt;코드잼 티셔츠는 많은데 왜 해커컵은…&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;mobis-알고리즘-경진대회&quot;&gt;MOBIS 알고리즘 경진대회&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“더이상 MOBIS 대회는 못 나가는 몸이 되었습니다”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 현대모비스&lt;/li&gt;
  &lt;li&gt;결과 : 동상(3위)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/mobis-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;현대모비스에서 개최한 알고리즘 경진대회로, 운이 좋았는지 &lt;strong&gt;500만원&lt;/strong&gt;이라는 상금을 획득할 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/07/mobis-awards-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이건 시상식 직후에 &lt;a href=&quot;https://nyan101.github.io/blog/mobis-algorithm-contest-2022-review&quot;&gt;별도의 글&lt;/a&gt;을 작성한 적이 있어, 여기서는 자세한 설명을 생략한다. 이때 받은 상금으로 아이패드 프로를 사서 잘 쓰고있다.&lt;/p&gt;

&lt;p&gt;+ 올해부터 3등 이내 수상자는 차후 대회에 출전하지 못 하도록 제약이 생겨 이제 모비스 대회는 더이상 못 나간다(…)&lt;/p&gt;

&lt;h2 id=&quot;군장병-코딩경진대회&quot;&gt;군장병 코딩경진대회&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“어쩌다보니 맥북 프로, 아이패드 프로, 에어팟 프로를 모두 대회로 마련하게 된…”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 국방부, 국방오픈소스아카데미&lt;/li&gt;
  &lt;li&gt;결과 : 3위&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/osam-contest-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;매년 국방오픈소스아카데미에서 진행하는 &lt;군장병 공개=&quot;&quot; SW=&quot;&quot; 해커톤=&quot;&quot;&gt; 대회의 선발과정으로 이뤄지는 코딩경진대회이다. 다른 알고리즘 대회와 유사하게 문제풀이 방식으로 구성되었으며 프로그래머스 플랫폼을 통해 진행되었다.&lt;/군장병&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/osam-contest-award.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;앞 3개는 비교적 평이한 코딩테스트 문제들이었는데 마지막 문제에서 SOS(Sum of Subsets) DP를 이용해야 하는 문제가 나왔다. “이런 게 나온다고??” 라는 생각과 함께 겨우 시간 내에 해결해 제출했고, 그렇게 모든 문제를 풀어 400점 만점을 받았다. 전체 참가자들 중 만점자는 3명뿐이었지만 아쉽게도 제출시간의 차이로 인해 3등상(에어팟 프로)을 받았다. 이미 버즈 라이브를 잘 쓰고있어 에어팟은 당근마켓으로 보내졌다.&lt;/p&gt;

&lt;h2 id=&quot;공군-해커톤&quot;&gt;공군 해커톤&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“함께한 후임들에게 이 모든 영광을 돌립니다”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주최/주관 : 공군본부&lt;/li&gt;
  &lt;li&gt;결과 : 장려상&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/airforce-hackathon-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;공군본부에서 주관하는 아이디어 경연대회이다. 실제 코딩을 진행하지는 않고 아이디어를 제안하고 기획서와 발표를 통해 수상팀을 결정한다. 사실 작년에도 나갔었는데 예선부터 떨어져서 작년 후기에는 포함을 안 시켰다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/airforce-hackathon-award.jpg&quot; style=&quot;width:45%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;올해는 같은 부대에서 근무하는 후임들과 3인 팀을 이뤄 참가했다. 작년의 탈락을 거울삼아 좀더 신경써서 기획서를 작성했고, 팀원들이 애써준 덕인지 작년과는 달리 본선까지 진출해 최종 수상을 할 수 있었다.&lt;/p&gt;

&lt;h2 id=&quot;삼성-대학원생-프로그래밍-경진대회scpc&quot;&gt;삼성 대학(원)생 프로그래밍 경진대회(SCPC)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“이거 점점 어려워지는데(…)”&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;주관 : 삼성전자&lt;/li&gt;
  &lt;li&gt;결과 : 본선 진출&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2020/11/scpc-01.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;재작년, 작년에 이어 올해도 1,2차 예선, 본선 모두 온라인으로 진행되었다. 결과만 먼저 밝히면 올해도 본선은 나갔지만 성불(수상)은 하지 못했다(…) 문제가 점점 어려워지는 느낌인데 2023년에는 수상해서 성불하길…&lt;/p&gt;

&lt;hr /&gt;

</description>
        <pubDate>Sat, 31 Dec 2022 21:41:12 +0900</pubDate>
        <link>https://nyan101.github.io/blog/PS-contests-in-2022-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/PS-contests-in-2022-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2022년도 대회 후기 - 해킹(CTF) 편</title>
        <description>&lt;p&gt;2022년에는 대회 하나씩 끝날 때마다 후기를 쓰겠다고 다짐했지만 이번에도 결국 연말에 몰아서 쓰게 됐다(…)&lt;/p&gt;

&lt;p&gt;올해는 &lt;a href=&quot;https://nyan101.github.io/blog/CTF-contests-in-2021-review&quot;&gt;작년&lt;/a&gt;과는 달리 CTF에서도 나름의 성과가 있던 해였다. 아직 CVE를 찾거나 국방/공공분야라는 울타리를 벗어나지는 못했지만, 그래도 조금씩 경험이 쌓여가는 것 같아 나름 보람있게 보낸 느낌이다. &lt;del&gt;그런데 논문은 대체 언제 쓰지…&lt;/del&gt;&lt;/p&gt;

&lt;h2 id=&quot;국방-사이버보안-경진대회&quot;&gt;국방 사이버보안 경진대회&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 9.15.(본선)&lt;/li&gt;
  &lt;li&gt;주관 : 군사안보지원사령부(現 국군방첩사령부)&lt;/li&gt;
  &lt;li&gt;결과 : 우수(2위)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/dssc-contest-award.jpg&quot; style=&quot;width:45%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;군사안보지원사령부에서 주관하는 전군(육+해+공+국직) 대상 경진대회이다. 작년엔 코로나로 대회가 취소되는 탓에 출전하지 못했지만 다행히 작년 성적을 인정받아 올해 공군 대표단에 포함되어 나갈 수 있었다. 필기와 실기가 합쳐진 형식이었으며, 필기는 보안규정이나 정보보안 관련 지식을 묻는 지필고사 형식, 실기는 Jeopary 형식의 CTF로 진행되었다.&lt;/p&gt;

&lt;p&gt;본선장에 가니 전부 학과 선배, 동기들이어서 “이정도면 사실상 집안싸움 아닌가”라는 생각이 자연스럽게 들었는데 &lt;del&gt;실제로도 순위표 까보니 1,2,3등이 전부 사이버국ㅂ…&lt;/del&gt; 결과적으로 해군 대표로 나왔던 동기와 필기 &amp;amp; 실기 모두 동점으로 1위를 다투게 되었다. 모든 점수가 동점인 관계로 실기 CTF의 최종 제출시각을 기준으로 순위를 결정하기로 했고 우리 팀의 제출 시점이 조금 더 늦어 동기가 1위(국방부장관상), 우리 팀이 2위(안보지원사령관상)를 차지했다.&lt;/p&gt;

&lt;p&gt;+ 여담이지만 대회를 한달만 더 늦게 했어도 “군사안보지원사령관” 대신 “국군방첩사령관” 직인 찍힌 상장을 받았을 텐데 아슬아슬하게(?) 안보지원사령부 시절 마지막 상장을 가져가게 됐다.&lt;/p&gt;

&lt;h2 id=&quot;화이트햇-콘테스트&quot;&gt;화이트햇 콘테스트&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 10.15.(예선), 11.19.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 대한민국 국방부 / 사이버작전사령부&lt;/li&gt;
  &lt;li&gt;결과 : 국방트랙 우수(2위)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/whitehat-contest-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;사이버작전사령부에서 주관하는 CTF로, 일반 / 청소년 / 국방트랙이 별도로 분리되어 진행된다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2022/12/whitehat-contest-award-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2022/12/whitehat-contest-award-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;작년에 아쉽게 5위를 했던 기억이 있어 다들 마음을 다잡고 대회에 임했다. &lt;del&gt;지금까지 모든 대회에서 그랬듯이&lt;/del&gt; 본선 초반 빠르게 문제를 풀어 중간 1위를 달성했지만, 중반 이후 더 문제가 풀리지 않아 점차 추격해오는 다른 팀들을 긴장어린 눈으로 바라봤다. 막판에 추가된 문제들 중 암호학 관련 문제들이 포함되어있어 빠르게 추가 점수를 얻었고, 그 덕분인지 대회 마지막까지 최종 2위(합참의장상) 자리를 지켜낼 수 있었다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:center&quot;&gt;
&lt;img src=&quot;/assets/images/2022/12/whitehat-contest-award-03.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2022/12/whitehat-contest-award-04.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;작년에는 결국 수상권 안에 들지 못해 아쉬움이 많이 남았던 대회였는데, 올해는 운이 따랐는지 스타포스(?) +4성에 시상식까지 참석하면서 나름 인상적인 경험을 할 수 있었다.&lt;/p&gt;

&lt;h2 id=&quot;cce-사이버공격-방어대회&quot;&gt;CCE 사이버공격 방어대회&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 9.24.(예선), 10.27.(본선)&lt;/li&gt;
  &lt;li&gt;주최/주관 : 국가정보원 / 국가보안기술연구소&lt;/li&gt;
  &lt;li&gt;결과 : 전체 15위, 공공기관 4위 &lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/cce-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;국가정보원에서 주관하는 CTF로 일반인들을 위한 일반분야와 공공기관 종사자들을 위한 공공분야로 나눠 진행된다. 예선은 일반적인 Jeopardy(문제풀이) 방식, 본선은 Jeopardy와 함께 공격받는 Live 서버를 실시간으로 방어하는 방식으로 진행되었다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2022/12/cce-contest-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2022/12/cce-contest-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;온라인이었던 작년과 달리, 대구 EXCO에서 오프라인으로 본선을 진행했다.&lt;/p&gt;

&lt;p&gt;작년 실시간 방어 분야에서 헤멨던 만큼 올해는 나름 준비를 해갔지만, 웹서버 패치 방식이었던 작년과 달리 바이너리 패치 방식이어서 거의 손을 대지 못했다. NodeJS서버에 바이너리 실행파일이 올라가있고 이를 패치해 업로드하는 형식이었는데, 바이너리라는 특성상 오류가 나면 디버깅을 하지 못한다는 생각에 팀원들끼리 상의 후에 “괜히 잘못 건드려서 SLA Fail 패널티 받느니 그냥 기본점수만 받고 들어가자” 라는 합의가 진행됐다.&lt;/p&gt;

&lt;p&gt;여기에 Jeopary 방식은 역대급 난이도를 자랑했다(…) 우리 팀은 암호학 관련 문제를 겨우 풀었는데 그나마도 해당 주제에 대한 배경지식이 부족해 대회 시간 내내 인터넷에서 논문을 찾아가며 공부해야 풀리는 문제였다. 2020년대에 나온 논문을 참조해가며 Sage 코드를 작성했고, 몇 번의 시행착오 끝에 플래그를 획득할 수 있었다. 당시 중간 스코어보드를 확인해보니 공공분야 3위여서 혹시나 하는 마음으로 기도했지만 13시간 대회 중 종료 1시간 미만을 남겨두고 역전당해 최종 순위는 4위로 내려갔다.&lt;del&gt;후임, “매년 아깝게 그럴거면 차라리 그냥 20등을 하세요…”&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;대회가 끝난 후 확인해보니 공공분야 본선에 진출했던 20개 팀들 중 과반이 넘는 12개 팀이 대회 시간동안 1문제도 해결하지 못했다는 것을 알 수 있었다. 조금이라도 풀었으니 그보다는 낫다고 위안삼을 수도 있지만 일반부 스코어보드의 &lt;del&gt;기러기목 오리과의 모 동물이름을 쓰는&lt;/del&gt; 괴수집단들을 보면 아직 갈길이 멀다는 걸 새삼 깨닫게 된다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:space-evenly&quot;&gt;
&lt;img src=&quot;/assets/images/2022/12/cce-party-01.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2022/12/cce-party-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;대회가 끝난 후 Theori 주관으로 참가자들 간 애프터파티가 열렸다. 오랜만에 보는 낮익은 얼굴들과 즐거운 시간을 보낼 수 있었다.&lt;/p&gt;

&lt;h2 id=&quot;dfc-디지털-포렌식-챌린지&quot;&gt;DFC 디지털 포렌식 챌린지&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;일시 : 5.1. ~ 9.30.&lt;/li&gt;
  &lt;li&gt;주최/주관 : 한국정보보호학회&lt;/li&gt;
  &lt;li&gt;결과 : 장려상(7위)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/dfc-contest-main.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;한국정보보호학회에서 주관하는 대회로, 매달 다양한 주제의 포렌식 문제가 공개되고 이를 해결해 보고서를 제출하는 형식의 대회이다. 학과 선배, 동기들과 함께 6인 팀을 구성해 나갔으며, 주기적으로 온라인 회의를 통해 각자의 진행상황을 공유했다. 장장 5개월에 걸쳐 진행되는 만큼 페이스 조절이 어려운 대회였다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/12/dfc-contest-award-01.jpg&quot; style=&quot;width:85%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그렇게 긴 여정이 끝나고 최종 7위라는 결과를 얻었다. 6위 팀까지 장려상이 수여된다고 알고있어 다들 낙심하던 중, 해외 팀들의 참여 부족으로 국내 수상팀 숫자에 TO가 하나 늘어나면서 아슬아슬하게 수상 막차를 탈 수 있었다.&lt;/p&gt;

&lt;div style=&quot;width:90%;min-width:320px;margin:0 auto;display:flex;justify-content:center&quot;&gt;
&lt;img src=&quot;/assets/images/2022/12/dfc-contest-award-02.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;img src=&quot;/assets/images/2022/12/dfc-contest-award-03.jpg&quot; style=&quot;width:49%;display:inline-block&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;번외로, 상패에 영문 수상명이 “Participation Prize”로 되어있어 팀원들끼리 농담조로 “이거 참가상 아니야?” 라는 말을 했는데 구글검색 결과 장려상이 영어로 Participation Prize라는 사실을 알게 되었다.&lt;del&gt;그냥 내가 영알못이었던 걸로&lt;/del&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;분야별 3위까지 상이 수여된다… &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sat, 31 Dec 2022 19:58:31 +0900</pubDate>
        <link>https://nyan101.github.io/blog/CTF-contests-in-2022-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/CTF-contests-in-2022-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>2022 현대모비스 알고리즘 경진대회 후기</title>
        <description>&lt;p&gt;&lt;strong&gt;TL;DR : 상금 500만원 감사합니다 &amp;gt;_&amp;lt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/PS-contests-in-2021-review&quot;&gt;작년&lt;/a&gt;에 이어 올해도 현대모비스에서 알고리즘 경진대회를 개최했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/07/mobis-poster.jpg&quot; style=&quot;width:70%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이번에도 1등상품으로 &lt;strong&gt;최신형 자동차&lt;/strong&gt;를 내걸었다는 상징성으로 인해 온라인에서 화제가 됐다. 올해는 작년과는 다르게 학생부 / 일반부를 분리해 운영했는데, 직업적인 특성(…)으로 인해 다소 애매한 포지션이었던 관계로 주최측 문의 후 안내에 따라 일반부로 지원했다.&lt;/p&gt;

&lt;h3 id=&quot;예선&quot;&gt;예선&lt;/h3&gt;

&lt;p&gt;작년과 올해 대회를 모두 참가해본 입장에서 꽤 많은 부분이 바뀐 것을 느낄 수 있었다. 대표적인 것들을 뽑아보면 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작년(2021)
    &lt;ul&gt;
      &lt;li&gt;프로그래머스 플랫폼 사용&lt;/li&gt;
      &lt;li&gt;모든 테스트케이스에 대한 정답 여부 공개&lt;/li&gt;
      &lt;li&gt;실시간 스코어보드 제공&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;올해(2022)
    &lt;ul&gt;
      &lt;li&gt;구름 플랫폼 사용&lt;/li&gt;
      &lt;li&gt;정답 여부 비공개(본선에서는 일부 정보 공개)&lt;/li&gt;
      &lt;li&gt;스코어보드 미제공&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;정답 여부가 비공개라는 점으로 인해 답안을 제출한 이후에도 “과연 제대로 푼 게 맞나”라는 의혹을 떨치기 힘들었고, 그렇게 스스로에 대한 믿음과 의심(?) 속에서 대회를 진행했다. 1~4번 문제를 해결한 후 마지막 문제를 고민했지만 정해가 떠오르지 않았고, 결국 고민 끝에 정해를 찾는 대신 나름대로의 휴리스틱 알고리즘을 설계해 구현했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/07/mobis-preliminary-score.jpg&quot; style=&quot;width:90%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;대회종료 후 결과를 보니 생각했던 휴리스틱이 나름 잘 작동한 것 같아 만족스러웠지만 당연히(?) 맞았다고 생각했던 2번 문제에서 66/150이라는 낮은 점수를 받았다. 후문에 따르면 구름 플랫폼의 스택 메모리 제한이 생각보다 적었고, 이로 인해 재귀함수의 호출 깊이에 한계가 존재했다고 한다(…)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/07/mobis-preliminary-scoreboard.jpg&quot; style=&quot;width:90%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그렇게 예선 4등으로 본선에 진출했다. 사실 처음엔 4등~30등까지 제공되는 아이패드 에어를 보고 참가했지만 막상 이렇게 되니 &lt;em&gt;“이거 잘하면 3등 안에 들 수도 있겠는데?”&lt;/em&gt; 라는 생각이 피어올랐다.&lt;/p&gt;

&lt;h3 id=&quot;본선&quot;&gt;본선&lt;/h3&gt;

&lt;p&gt;&lt;del&gt;예선에서 수많은 참가자들의 항의 끝에&lt;/del&gt; 본선에서는 예선에 비해 일부 규칙이 바뀌었다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;모든 테스트케이스를 통과한 경우 정답임을 알려주었다&lt;/li&gt;
  &lt;li&gt;각 테스트케이스에 대해 수행시간 / 사용 메모리를 알려주었다&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;정답인 경우 확실히 정답임을 알려준다는 점에 힘입어 예선에서 겪었던 많은 부담감이 사라졌고, 한결 편한 마음으로 참가할 수 있었다. 다만 대회를 진행하는 도중 3번 문제의 지문이 다소 모호하게 서술되었는데, 문장의 해석에 대한 모든 질문에 &lt;em&gt;“대회의 공정성을 해칠 수 있어 답변하지 않는다”&lt;/em&gt; 라는 기계적인 답변만이 돌아온 것은 다소 아쉽게 느껴졌다. 풀이에 대한 힌트가 아닌 문제 자체의 조건을 이해하는 데 있어서의 안내는 전체공지 등을 통해 가능하지 않을까라는 생각이었지만, 결국 대회 도중에는 이에 대한 추가적인 답변을 받지 못한 상태에서 본선이 종료되었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/07/mobis-final-score.jpg&quot; style=&quot;width:90%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;예상했던 대로 3번 컨셉카 전시 문제에서 그렇게 높은 점수를 받지는 못했지만 4번에서 생각보다 높은 점수를 받았기에 약간의 기대를 가지고 최종 순위가 공개되기를 기다렸다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2022/07/mobis-final-scoreboard.jpg&quot; style=&quot;width:90%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;본선이 끝난 다음주 월요일 순위가 공개되었고, 일반부 최종 3등이라는 결과를 얻었다. 원래 예상했던 아이패드에 비해 무척 높은 액수의 상금도 받고, 별도 시상식에도 초대되는 등 높은 성취긴 하지만 &lt;del&gt;사람 마음이라는게 워낙 간사해서&lt;/del&gt; &lt;em&gt;“만일 3번 문제에서 조금만 더 높은 점수를 받았더라면 상금이 2배인데”&lt;/em&gt; 라는 약간의 아쉬움이 함께하는 결과였다.&lt;/p&gt;

&lt;h3 id=&quot;시상식&quot;&gt;시상식&lt;/h3&gt;

&lt;p&gt;그렇게 역삼역 현대모비스 본사에서 열리는 시상식에 초대되었다. 학생부 / 일반부 각 1~3등까지 총 6명의 수상자와 대회 운영진 분들이 함께했다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/07/mobis-awards-platform.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;예상을 안 헀던 건 아니지만&lt;/del&gt; 대부분이 다른 대회들에서 자주 봐 친숙했던 분들이었고, 오랜만에 만나 안부를 전할 수 있었다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/07/mobis-awards-main.jpg&quot; style=&quot;width:80%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;상금에서 기타소득세 4.4%가 공제된 478만원이 입금된다는 안내와 함께 기념 상패를 받았다.&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Sun, 17 Jul 2022 13:52:12 +0900</pubDate>
        <link>https://nyan101.github.io/blog/mobis-algorithm-contest-2022-review</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/mobis-algorithm-contest-2022-review</guid>
        
        <category>대회</category>
        
        
        <category>근황</category>
        
      </item>
    
      <item>
        <title>[PyTorch] 06. wandb로 학습 진행상황 로깅하기</title>
        <description>&lt;h2 id=&quot;학습-진행상황-기록하기&quot;&gt;학습 진행상황 기록하기&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://nyan101.github.io/blog/notes-on-pytorch-04&quot;&gt;이전 글&lt;/a&gt;에서 작성한 코드는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tqdm&lt;/code&gt; 라이브러리를 통해 “학습이 얼마나 진행되었는가”를 실시간으로 출력했다. 이를 통해 실행이 끝나기까지 막연히 기다리기만 하는 일반적인 코드와는 달리, 각 epoch당 남은 예상시간과 epoch별 train/val loss, accuracy를 출력해 학습이 진행됨에 따라 정확도가 높아지는 모습을 로그로 남길 수 있었다.&lt;/p&gt;

&lt;p&gt;지난번 코드의 출력 일부를 아래에 옮겼다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Using device: cuda
-----------------
&amp;gt; Epoch 1/5
100%|██████████| 200/200 [00:05&amp;lt;00:00, 34.14it/s]
val Loss: 2.3033  Acc: 0.1043 (1043/10000)
-----------------
&amp;gt; Epoch 2/5
100%|██████████| 800/800 [00:59&amp;lt;00:00, 13.52it/s]
train Loss: 1.4675  Acc: 0.4736 (18944/40000)
100%|██████████| 200/200 [00:04&amp;lt;00:00, 42.41it/s]
val Loss: 1.2823  Acc: 0.5465 (5465/10000)
-----------------
&amp;gt; Epoch 3/5
100%|██████████| 800/800 [00:59&amp;lt;00:00, 13.53it/s]
train Loss: 1.0625  Acc: 0.6243 (24970/40000)
100%|██████████| 200/200 [00:04&amp;lt;00:00, 42.35it/s]
val Loss: 1.1661  Acc: 0.5980 (5980/10000)
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;그런데 단순히 텍스트만 출력하지 않고, 학습 진행상황에 따른 지표를 그래프로 보고 싶다면 어떻게 해야 할까? 각 step별 loss, acc값을 리스트에 저장하고 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;matplotlib&lt;/code&gt;를 사용하는 것도 한 가지 방법이다. 그러나 이런 방법은 학습이 다 끝난 후에야 결과를 확인할 수 있고, 매 학습에서의 결과를 통합해 관리하기 어렵다는 단점이 있다. 이번 글에서는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb&lt;/code&gt;를 통해 모델의 학습 진행상황을 추적하고 이를 관리하는 법에 대해 알아보자.&lt;/p&gt;

&lt;h2 id=&quot;wandb란-무엇인가--가입-및-초기-설정&quot;&gt;wandb란 무엇인가 &amp;amp; 가입 및 초기 설정&lt;/h2&gt;

&lt;p&gt;wandb는 &lt;del&gt;Wan DB가 아니라&lt;/del&gt; Weight &amp;amp; Bias의 약자로, 모델의 학습 진행상황을 추적하고 자동화된 파라미터 튜닝을 지원하는 웹 도구이다. 공식 홈페이지(https://wandb.ai/)에서 github나 gmail 계정을 이용해 쉽게 가입이 가능하며, 처음 로그인하면  다음과 같은 화면을 볼 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-firstpage.jpg&quot; alt=&quot;wandb-firstpage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;터미널에서 다음 명령어를 통해 wandb를 설치하고 웹에 표시된 API Key를 입력하자.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install wandb
wandb login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제 파이썬에서 wandb를 사용할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;wandb를-이용해-학습-진행상황-로깅하기&quot;&gt;wandb를 이용해 학습 진행상황 로깅하기&lt;/h2&gt;

&lt;p&gt;wandb의 주요 기능은 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;진행상황 추적을 위한 세션 관리(Worksplace, Table)
    &lt;ul&gt;
      &lt;li&gt;매 실험(run)마다 사용했던 설정값(config) 기록&lt;/li&gt;
      &lt;li&gt;실험이 진행되는 동안 주요 값(loss, acc 등) 추적&lt;/li&gt;
      &lt;li&gt;실험이 진행되는 동안 CPU, GPU, 메모리 사용량 등 추적&lt;/li&gt;
      &lt;li&gt;실험이 진행되는 동안 모델 파라미터들의 그래디언트, 파라미터값 추적&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;보고서 관리(Reports)&lt;/li&gt;
  &lt;li&gt;자동화된 하이퍼파라미터 튜닝(Sweeps)&lt;/li&gt;
  &lt;li&gt;모델 버전 관리(Artifacts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;여기서는 wandb의 로깅 기능에 집중하자. 앞서 wandb를 설치하고 API Key를 입력했다면 아래와 같은 코드를 통해 wandb 세션(run)을 시작할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;wandb&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;batch_size&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;epoch&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;some-other-config&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;you can put any value here&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;my-wandb-project&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;run-1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;save_code&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.init()&lt;/code&gt;에서의 주요 파라미터는 다음과 같다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;project&lt;/code&gt; : 프로젝트명. 웹에서 “Create new project”로 생성한 프로젝트명을 사용하거나 새로운 이름을 사용할 수 있다. 존재하지 않는 프로젝트명을 입력하면 자동으로 해당 이름을 가진 새로운 프로젝트가 생성된다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt; : 세션의 이름. 입력하지 않으면 자동으로 랜덤한 이름이 배정된다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config&lt;/code&gt; : 세션에서 사용한 주요 설정값. key-value 형태의 dictionary로 전달한다.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save_code&lt;/code&gt; : True인 경우 해당 세션을 수행한 코드를 함께 저장한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;세션이 활성화되면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.log()&lt;/code&gt;를 통해 해당 세션에서 값들을 기록할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;var1&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;var2&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;값 기록은 위와 같은 dictionary 형태로 이루어지며, wandb.log()를 호출할 때마다 동일한 키에 대한 값들이 누적되어 기록된다. 단순 스칼라(scalar) 값 외에도 히스토그램, 산포도와 같은 차트를 비롯해 이미지, 사운드, 비디오 등 다양한 형태를 기록할 수 있다.(&lt;a href=&quot;https://docs.wandb.ai/guides/track/log/media&quot;&gt;참조&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;기록이 모두 끝나면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.finish()&lt;/code&gt;를 통해 현재 활성화된 세션을 종료할 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;train_model-함수에-wandb-코드-추가하기&quot;&gt;train_model() 함수에 wandb 코드 추가하기&lt;/h2&gt;

&lt;p&gt;이제 &lt;a href=&quot;https://nyan101.github.io/blog/notes-on-pytorch-04&quot;&gt;이전 글&lt;/a&gt;에서 작성했던 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;train_model()&lt;/code&gt; 함수에 wandb와 연동하는 코드를 추가해보자. 기존 코드에서 추가된 부분을 주석으로 강조했다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;train_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;cuda&apos;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_available&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;cpu&apos;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Using device: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c1&quot;&gt;### config값을 저장한 dict 생성 ###
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;model_name&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;batch_size&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;batch_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;epoch&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;criterion&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;optimizer&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;some-other-config&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;you can put any value here&apos;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;### 새 wandb 세션 시작 ###
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reinit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;my-wandb-project&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;### 모델 파라미터(그래디언트 등) 추적을 위한 .watch 호출 ###
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-----------------&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;gt; Epoch &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;val&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_grad_enabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;epoch_corrects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tqdm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]):&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zero_grad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;backward&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_pred&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;epoch_corrects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y_pred&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;### train phase 한정으로 각 batch마다 loss를 기록 ###
&lt;/span&gt;                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;train_loss&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;epoch_acc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch_corrects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;### 각 epoch마다 해당 phase에서의 loss, acc을 기록 ###
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
                &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;_epoch_loss&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;_epoch_acc&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epoch_acc&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; Loss: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch_loss&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;  Acc: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch_acc&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;epoch_corrects&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;### 학습이 끝난 후 세션 종료를 위한 .finish() 호출 ###
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;wandb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;finish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제 다양한 상황에서 위 train_model() 함수를 호출해보자. 코드를 단순화하기 위해 하이퍼파라미터를 튜닝하는 대신 서로 다른 모델을 불러와 학습하는 것으로 대체했다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# resnet18로 학습 진행
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resnet18&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Linear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CrossEntropyLoss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Adam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;train_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;resnet18&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# resnet34로 학습 진행
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resnet34&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Linear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CrossEntropyLoss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Adam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;train_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;resnet34&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# vgg16으로 학습 진행
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vgg16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pretrained&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;classifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Linear&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;classifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;in_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CrossEntropyLoss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Adam&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;train_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;net&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;criterion&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataloaders_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_epochs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;vgg16(pretrained)&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;코드를 실행하고 출력을 보면 매 train_model() 호출마다&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 새로운 wandb 세션이 만들어지는 것을 볼 수 있다.&lt;/p&gt;

&lt;h2 id=&quot;웹에서-wandb-결과-확인하기&quot;&gt;웹에서 wandb 결과 확인하기&lt;/h2&gt;

&lt;p&gt;위 코드를 보면 각 batch마다 loss를, 각 epoch/phase마다 loss, acc을 기록하는 것을 볼 수 있다. 웹브라우저를 열어 wandb에 접속하면 학습이 진행됨에 따라 대시보드에 실시간으로 차트가 그려진다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-charts.jpg&quot; alt=&quot;wandb-charts&quot; /&gt;&lt;/p&gt;

&lt;p&gt;별다른 설정을 하지 않았다면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.log()&lt;/code&gt; 를 통해 기록된 값들이 각 세션별 plot으로 그려지며, 그 외에 이미지, 사운드 등 미디어의 경우 별도의 적절한 형태로 표시된다.&lt;/p&gt;

&lt;p&gt;왼쪽 목록에서 세션 이름을 클릭하면 세부 정보를 확인할 수 있다. 각 탭에서 볼 수 있는 정보에 대해 알아보자.&lt;/p&gt;

&lt;p&gt;Overview 탭에서는 해당 세션이 실행된 환경의 기본적인 정보와 함께, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.init()&lt;/code&gt;에서 config에 넘겨줬던 값들을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-run-overview.jpg&quot; alt=&quot;wandb-run-overview&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Charts 탭에서는 해당 세션에서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.log()&lt;/code&gt;로 기록했던 값들을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-run-charts.jpg&quot; alt=&quot;wandb-run-charts&quot; /&gt;&lt;/p&gt;

&lt;p&gt;System 탭에서는 해당 세션이 실행되는 동안의 CPU, GPU, 메모리 사용량 등을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-run-system.jpg&quot; alt=&quot;wandb-run-system&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Logs 탭에서는 해당 세션이 실행되는 동안 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;print()&lt;/code&gt;를 통해 콘솔에 출력된 값을 그대로 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-run-logs.jpg&quot; alt=&quot;wandb-run-log&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Files 탭에서는 해당 세션과 관련된 메타데이터 파일을 볼 수 있다. 기본적으로 환경 정보, 패키지 정보, 로그파일 등이 저장되며, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wandb.init(save_code=True)&lt;/code&gt;인 경우 소스파일이 함께 저장된다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/images/2022/02/wandb-run-files.jpg&quot; alt=&quot;wandb-run-files&quot; /&gt;&lt;/p&gt;

&lt;p&gt;이외에도 wandb에서는 “학습이 끝나면 메일/슬랙으로 알림 보내기”, “팀원들 간 공유 프로젝트 만들기” 등 생산성 향상을 위한 다양한 기능을 제공한다.&lt;/p&gt;

&lt;hr /&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;정확히는 wandb.init() 호출마다 &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Sat, 12 Feb 2022 19:37:41 +0900</pubDate>
        <link>https://nyan101.github.io/blog/notes-on-pytorch-06</link>
        <guid isPermaLink="true">https://nyan101.github.io/blog/notes-on-pytorch-06</guid>
        
        <category>전산</category>
        
        <category>개발</category>
        
        
        <category>자습</category>
        
      </item>
    
  </channel>
</rss>
