저번 포스팅에서 언급했던 1월 30일부터 2월 1일까지 1박 3일로 진행되는 동계 빅데이터 AWS 캠프에 참여했다. 일정은 아래와 같이 2일교육후 밤샘 개발 형식으로 진행되었으며 , 만들었던 프로젝트에 대해 간단하게 포스팅 해보겠다.
해커톤에 주제는 '지역사회 문제 해결' 이었다. 처음에는 지역사회라는 단어에 치중해 다양한 지역 문제를 어떻게 해결할지에 먼저 생각하게 되었고 , 많은 아이디어들이 나왔지만 의견 수렴이 힘들었다.
이에 , 일반적인 문제 상황을 해결해 전반적인 사회 발전에 기여하는 쪽으로 아이디어를 생각해 '아이들을 위한 스마트 일기 서비스'라는 주제를 선정하게 되었다.
가장 처음 구상한 아키텍처는 아래와같다.
위와 같은 프로세스를 하면 서버를 만들 필요가 없고 serverless 환경에서 이벤트가 발생했을때만 트리거를 발동시켜 서비스를 수행하도록 할 수 있고 , 서버를 열었을때보다 비용절감을 할 수 있다.
먼저 환경을 만들기 위해 우선 위와같이 S3 버킷을 만들고 컴퓨터 역할을 하는 AWS cloud 9을 먼저 만들고 cli코드를 통해 client에 frontend인 즉, 웹을 구성하는 코드를 build했다. 따라서 아래와 같이 웹을 구성하기 위한 코드들이 모두 버킷에 올라갔고 웹 호스팅이 바로 가능하다.
개발 중간에 문제가 발생했다. 우리 서비스에 핵심은 웹인데 , 4명으로 구성된 우리 팀원에서 복잡한 frontend코드를 제대로 다뤄본 팀원이 없었다. 따라서 새로 frontend코드를 구성하는데 무리가 있었고 , 어쩔 수 없이 2일동안 강의자료로 사용한 짜주신 코드에 의존할 수 밖에 없었다. 해당 코드는 3tier(s3로 웹 호스팅 , RDS 저장소 사용 , ec2서버사용) 하는 방식으로 react를 기반으로 구성되어 있었다 .
dynamodb와 lambda의 장점을 최대한 활용하지 못해 아쉽지만 시간이 한정되어 있었기에 어쩔수 없이 해당 코드를 수정하는 방향으로 방향으로 진행하기로 결정했고 , 그나마 웹 프로젝트를 해본 내가 대부분 수정하는 역할을 맡았다. 수정은 cloud9 cli를 통해 s3로 build했다. 아키텍처는 중간에 있는 lambda가 ec2 로 dynamodb가 RDS로 변경되었다.
정리하자면 다음과 같다.
이후 우리 서비스에 맞는 결과를 도출하기 위해 promt engineering을 진행했다. 모델은 gpt4를 api를 활용했으며 실제 팀원이 썼던 일기 데이터를 텍스트화 시켜 모델에 넣어보니 아래와 같이 불안정했다.
이에 특정 변수에 가중치를 두고 instruction을 수정하는 promt enginerring과정을 여러번 거쳐 결과를 도출해 냈다.
아래는 실제 일기를 넣었을때 나온 결과이다. 선생님 같은 코멘트와 , 맞춤법을 , 불안정한 표현들을 수정해주는 의도와 맞는 output을 도출해 낼 수 있었다.
일기를 기반으로 이미지를 생성하는것도 또하나의 task였다. 처음에는 친근한 느낌의 이미지를 생성하기 위해 hugging face에서 'stablediffusionapi/disney-pixar-cartoon' api를 가져와 promt를 수정해 이미지를 생성하려 했으나 , 원하는 느낌의 이미지를 생성해내지 못했다.
이때 멘토님의 조언을 받아 AWS bedrock 시스템을 활용해 보려고 했고 , aws bedrock에서 지원하는 수많은 이미지 생성 모델중 Transformer기반이며 가장 좋은 결과를 생성해준 Titan Image Generator G1v1을 선택했다.
# 실제 일기 데이터 내용 #
오늘 있었던 일 ~ 현재시각 오전 8시 30분,
할 일이 없어서, 아침먹고, 영화를 보러 가기로 했다.
..... 아빠와 함께 석가탄신일을 맞이하여.....
..... 절에 가 보았다....... 절이 생각보다 컸다.....
input으로 들어갈 실제 일기내용을 간단하게 적으면 위와 같다.
한국어를 지원하지 않기 때문에 gpt를 통해 번역을 먼저하고 결과와 negative promtpt를 추가해 이미지를 생성하였다. nagative promtpt를 추가하면서 완벽하지는 않지만 내용과 어느정도 맞는 이미지를 생성할 수 있었다.
이후 , lambda를 통해 output을 받아 aws bedrock과 연결해 이미지를 생성하려고 bedrock모델의 api를 연결했으나, lambda를 통해 웹사이트에 이미지를 띄우는 프로세스 구축에 어려움을 겪었고 , 결국 제한시간안에 수행해 내지 못했다.
따라서 최종 결과는 아래와 같다. 실제 일기를 입력하고 코멘트 받기 버튼을 누르면 promtpt engeneering된 gpt가 선생님같은 느낌에 코멘트를 생성해준다. 다소 깔끔하지 않는 나열 형식이지만 맞춤법 교정이나 , 선생님같은 코멘트등은 원하는 output으로 잘 생성된것 같다.
이번 해커톤으로 진행했던 프로젝트는 지금까지 중 가장 난관이 많았던 프로젝트였던 것 같다. 아이디어를 결정하는 과정이 늦어져 남들보다 개발에 늦게 시작했고 시간 안에 해야 한다는 조바심, 욕심에 비해 조화가 이루어지지 않았던 개개인의 능력으로 인한 일에 효율성 저하가 아마 큰 원인이지 않을까 싶다.
결과 또한 처음 계획했던 계획들이 수도 없이 많이 틀어졌다. lambda에서 ec2로 바꾼 점, dynamodb에서 RDS로 바꾼 점, image 생성까지 구현 못한 점들이 많이 아쉬웠다. 솔직히 정신과 몸이 동시에 힘들어지니 아무것도 하지 못하고 있는 팀원을 속으로 원망하기도 하고,'내가 더 많은 것을 해봤더라면'이라는 생각을 가지면서 나 자신에게 자극을 주기도 했다.
몸도 마음도 지쳤던 프로젝트였지만, 이것도 나에게 돈 주고도 못 사는 좋은 경험이었다고 생각한다. 현업에 간다고 모든 협업 상황이 최고의 환경이고 프로젝트가 다 원활하게 진행된다는 법이 있을까? 아마, 지금과 비슷하게 협업이 원활하게 이루어지지 않는 상황들도 많을 것이다. 특히, 시간 안에 해야 하는 해커톤은 더 그렇다.
이 경험을 통해, 한 명이 모든 것을 다 잘하기는 어렵다는 것을 깨달았다. 그래서 각 분야의 전문가가 있는 것이고 이 전문가들이 조화를 이루어야 좋은 프로젝트가 나오게 되는 것 같다. 그래서 기업들도 채용에 협업 능력을 강조하고, 다양한 협업 환경에서 능동적으로 대처하는 것은 많은 프로젝트 경험에서 노하우가 나오는 것 같다.
그래도, 한 번도 사용해 보지 못한 AWS를 마음껏 사용하면서 S3, ec2,lambda 등 다양한 AWS 서비스에 익숙해질 수 있었고 클라우드의 편리성과 필요성을 다시 한번 느끼게 된 해커톤이었다. 또한 밤샘 개발이라는 것을 처음 해보면서 제한된 시간에 원하는 결과를 내기 위해 노력하는 수많은 사람들을 보면서 IT 분야의 생기를 느낄 수 있었고, 나에게 많은 자극도 되는 의미 있는 프로젝트였다.