본문 바로가기

Data & AI

Trading AI Inference Data Serving & Visualization

반응형

https://www.youtube.com/watch?v=dyWPTAiIcsQ

 

 

안녕하세요. 

 

오늘은 비록 관심과 조회수는 저조할 수 있지만

 

JeTech Lab 개발하면서 개발한 내용들을 슬며시 보여주면서 포스트를 공유하려고 합니다. 

 

올해 남은 기간 시간을 많이 투자하는 게 JeTech Lab 서비스 출시이기 때문에 

 

제가 할애하는 시간이 많고, 포스트도 이런 내용들도 담아낼 수밖에 없음을 이해해 주시기 바랍니다. 

 

그래도 개발을 하시는 분들도 제법 있고,

 

트레이딩을 하시는 분들도 내년에 체험하게될

 

JeTech Lab 이라는 투자자문 서비스가 어떻게 만들어지는지 재미 삼아 보시면 좋을 것 같습니다. 

 

 

Q/A 관련

 

너무 개발이야기만 하면 딱딱할 것 같아 초반에 스몰토크를 좀 진행하려고 합니다.

 

블로그/유튜브 댓글이나 메일로 문의사항 많이들 남겨주시는데

 

조금 더 문의가 쌓이게 되면 한꺼번에 답변드리는 영상을 공유할 수 있도록 하겠습니다. 

 

대신 여러번 문의온 항목들에 대해 이야기를 하자면

 

AI 석박사 출신인지, 그리고 AI진로에 대한 컨설팅, 강의 계획에 대해 문의를 많이 주셨는데요.

 

저는 그냥 공대 학사이고요. 컴퓨터공학도 전공하지 않은 비전공자입니다.

 

개발에 필수라고 생각한 과목들만 몇 개 들어서 부전공한 정도이고 

 

개발스킬은 학생때부터 여러 프로젝트를 하고 실무에서 겪은 경험들로 다져왔고

 

AI도 시중에 나온 책들을 모두 읽어가면서 기초를 다지고 직면한 문제를 해결하기 위해 논문을 읽고 구현해 나가면서 배워온 것 같습니다. 

 

길바닥에서 지식을 습득한 케이스라 감히 AI 전공 대학원 분들께 어떻게 컨설팅을 해드릴것도 없을 것 같고요

 

강의 제작과 관련된 질문에도 계획이 없다고 답변드릴 수밖에 없습니다.

 

(비전공 출신 개발자의 AI 모델 튜닝하기 이런 제목으로 하면 어그로는 끌 것 같긴 하네요)

 

저는 가지고 있는 지식을 남들에게 잘 설명하고 이해시키는 선생님 같은 유형의 인간은 아닌 것 같습니다. 

 

전공에 대한 질문도 있었는데 저는 산업공학을 전공했습니다. 

 

산업공학에서도 기본적인 프로그래밍을 다루긴 했지만, 제가 실무에서 컴퓨터공학을 전공한 뛰어난 개발자들과 일하다 보면

 

입이 벌어질 정도로 자료구조와 알고리즘을 잘 활용하는 친구들을 보면서

 

내가 부족한 실력으로 운 좋게 여기에 들어왔구나를 느끼곤 합니다. 

 

그래도 저는 그 친구들과는 다르게 산업공학의 DNA라고 할 수 있는 "나무가 아닌 숲을 보는 시야"를 가진 개발자라고 느끼곤 합니다.

 

어릴 때 책을 읽을 때도 전체 시스템이 담긴 목차부터 글을 읽고 구조화하고

 

무언갈 개발해야 할 때도 시스템 아키텍처들처럼 시스템의 구조적 관점에 신경을 쓰고

 

다른 시스템 간 상호작용과 연동구조를 고민하는데 더 시간을 쓰고 있는 것 같습니다. 

 

그리고 들어온 질문에 수익인증에 대한 이야기도 있는데

 

사실 이 블로그 생각 카테고리에 몇 번 수익인증인 듯 돈자랑인듯한 글을 적은 적이 있는데

 

수익인증카테고리가 아니라 생각 카테고리인 것처럼,

 

대한민국에서 돈을벌려고 노력하던 20대를 뒤돌아보며 느낀 감정들을 적어낸 적이 있습니다. 

 

그 글에서는 수익인증을 앞으로 하지 않겠다고 했지만, 제가 하는 일의 특성상 제가 전달하는 데이터의 실증이 되어야겠죠

 

그래서 제 지갑사정보다는 제가 여러분들에게 제공하는 시장분석 모델들의 트레이딩 수익은 보여드려야 맞다고 생각하고

 

JeTech Lab에서 모델들의 수익들도 같이 시각화할 수 있는 기능들을 추가 할 예정입니다. 

 

보여주지 말라고 해도 매번 데이터가 업데이트될 때마다 모델의 수익을 확인할 수 있게 해 드리겠습니다. 

 

 

 

AI 모델의 추론 

 

이제 JeTech Lab 개발 이야기를 해보겠습니다. 

 

제 콘텐츠를 우연히 접한 분들에게 JeTech Lab을 간단히 설명드리면

 

시장을 분석하고 예측하는, 최신 딥러닝 모델을 활용한  AI 트레이딩 모델들이 실시간으로 시장에 대한 분석 데이터를 공유해서 

 

여러분들의 투자 의사결정을 돕는 웹서비스입니다. 

 

AI 모델들을 활용하기 때문에 모델을 훈련시키고 추론하는 과정이 필요합니다. 

 

이 파트에선 훈련으로 만들어진 모델에 실시간 데이터를 넣고 추론하여 예측, 분석데이터를 얻는 과정에 대해 이야기합니다. 

 

pytorch 기반의 모델들은 Module 구현 모델들에 forward 함수가 구현되어 있습니다. 

 

모델의 입력에 대해 어떤 절차를 거쳐 layer들을 거쳐 연산을 진행하고 출력을 할지에 대한 함수입니다.

 

모델의 훈련도, 추론도 이 함수를 이용해야 합니다. 다만 차이점이 있다면

 

학습 때에는 모델의 가중치를 학습하며 조절하기 때문에 미분 연산을 수행하면서 호출하지만

 

추론 시에는 with torch.no_grad(): 문에서 호출되어야 한다는 것, eval() 모드를 켜야 한다는 점이 있습니다. 

 

일단 추론을 위해선 추론 호출시점의 실시간 데이터들을 가져와야 합니다. 

 

모델이 어떤 특성데이터들을 이용했는지 기억하고, 해당 특성함수들을 가공해 주고 훈련 때처럼 같은 데이터들을 주입해주어야 합니다. 

 

pytorch data loader를 통해 구현해 둔 추론함수데이터를 가져오고

 

학습하면서 도출한 모델의 가중치를 모델에 적용합니다. 

 

inference_data, inference_loader = self._get_data(flag='inference')
checkpoint_path = os.path.join('./checkpoints/' + setting, 'checkpoint.pth')
self.model = load_model_or_state_dict(self.model, checkpoint_path)

 

checkpoint에 저장되어 있던 모델들에서 가중치를 모델에 적용합니다. 

 

self.model.eval()
folder_path = './inference/' + setting + '/'
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

with torch.no_grad():
    input = np.expand_dims(inference_data[0][0], axis=0)
    input = torch.from_numpy(input).float().to(self.device)
    outputs = self.model(input)

 

 

그 이후에 model.eval() 모드로 변경하여 레이어의 동작 방식을 변경하고 모델 자체의 작동 방식을 평가 모드로 바꿉니다.

 

no_grad는 그래디언트 계산을 비활성화하는 것이며, 메모리 사용량을 줄이고 불필요한 그래디언트 계산을 방지합니다.

 

input 데이터는 여러분들이 데이터구조를 어떻게 정의해 두었는지에 따라 다른데 저는 데이터를 조금 가공해주어야 했습니다. 

 

GPU로 학습했기에 모델 device가 cuda로 되어있기에 입력데이터 텐서들도 gpu로 보내주기 위한 처리들이 포함되어 있습니다.

 

inputs = inference_data[0][0][:, -1]
inference_visual(inputs, outputs ,  os.path.join(folder_path, f'inference_{now.strftime("%Y%m%d%H%M%S")}.pdf'))

inference_save(
    self.args.asset, # asset
    self.args.model, # model
    now.strftime('%Y-%m-%d'), # pred_date
    inputs,
    outputs # pred_values
)

 

 

 

출력값들을 시각화하는 건 제가 추론을 호출할 때 체크하기 위해 제가 별도로 구현한 부분이고

 

inference_save 함수는 제가 JeTech Lab에 데이터를 시각화하기 위해 PostgreSQL로 데이터를 전송하는 부분이 구현되어 있습니다. 

 

추론데이터들이 잘 저장되어 있는 걸 확인할 수 있습니다. 

 

테이블 구조는 이후 섹션에서 소개하도록 하고, 

 

모델의 추론은 이렇게 마무리됩니다. 이런 과정을 여러 자산들, 여러 모델들마다 수행해주어야 합니다. 

 

그렇기에 자동화된 프로세스를 구축해야 하고

 

코드자체의 로직도 중요하지만 전체 시스템의 구조를 볼 줄 알아야 효율적인 시스템을 구축할 수 있습니다. 

 

 

추론 데이터 저장과 시각화 

 

앞서 추론 데이터들을 저장했습니다. 

 

JeTech Lab에서 추론 데이터들을 시각화해야 하기 때문에 테이블 스키마를 시각화 중점적으로 구성했습니다. 

 

react 진영에선 prisma라는 orm을 많이 활용하더라고요.

 

prisma를 이용해서 테이블 스키마를 정의해 주고 배포 시 해당 스키마가 적용되도록 했습니다. 

 

프로젝트에 prisma/schema.prisma 파일을 만들고 아래와 같이 코드를 적어주면 데이터베이스 스키마를 

 

코드로 편하게 관리할 수 있습니다. 

 

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model forecast {
  id              Int       @id @default(autoincrement())
  asset           String
  model           String
  forecast_date   String
  input_values    Decimal[]
  forecast_values Decimal[]
  created_at      DateTime  @default(now())
}

 

local에서 prisma studio로 데이터테이블을 조회할 수 있고

 

배포 스크립트에 소프트웨어 업데이트마다 변경되는 스키마들을 자동반영되게 할 수 있습니다. 

 

다음은 저장된 데이터를 가져오도록 구현해야 합니다. 

 

react에서는 react-query라는 강력한 라이브러리가 있는데

 

비동기 데이터 페칭 및 캐싱을 쉽게 관리할 수 있도록 도와주는 라이브러리입니다.

 

주로 API 요청을 처리하고, 그 데이터를 캐싱, 리패칭, 자동 갱신 등의 기능을 제공합니다.

 

  • 데이터 캐싱: 동일한 데이터를 여러 번 요청하지 않고, 한 번 가져온 데이터를 캐싱해 효율적으로 관리.
  • 자동 리패칭: 데이터가 변경되면 자동으로 다시 가져오는 기능.
  • 로딩 상태 관리: 데이터가 로드되는 중인지, 에러가 발생했는지 등을 쉽게 추적 가능.
  • 백그라운드 업데이트: 페이지 포커스나 네트워크 재연결 시 데이터를 자동으로 업데이트.

저는 실무에서 데이터를 시각화할 때도 해당 라이브리를 많이 활용한 경험이 있어서

 

JeTech Lab에서도 react-query를 활용해서 데이터를 시각화해줬습니다. 

 

next.js는 웹서비스의 화면을 그리는 Front-end 영역의 개발도 가능하고

 

데이터를 가져오고 처리하는 API를 만들기 위한 Back-end 영역의 개발도 가능합니다. 

 

우선 추론함수를 통해 저장했던 데이터들을 가져와야 하는데

 

이 부분도 prisma를 통해 손쉽게 진행할 수 있었습니다. 

 

이전에 설정했던 schema 파일에서 테이블 스키마에 따른 클래스가 생성되고,

 

해당 테이블의 조건과 조회에 대한 유용한 기능을 제공해 줍니다. 

 

아래처럼 forecast 테이블에서 데이터를 가져와서 시각화해줄 수 있습니다. 

 

(예시에선 데이터를 findMany로 모두 가져오지만 사용자의 요청에 맞게 조건을 줘서 조회를 해야 합니다. )

export async function GET(
    req: Request
) {
    const forecast = await prisma.forecast.findMany()

    return Response.json({
        result: {
            count: forecast.length,
            data: forecast
        }
    })

}

 

조회한 데이터들을 보면 아래와 같습니다. 

 

 

데이터들을 가져오는 건 성공했습니다. 

 

원래는 추론함수에서 Plotly 차트를 만들고 json으로 export, nextjs에서 json import를 하려고 했지만

 

조금 더 통제가능한 차트를 테스트하기 위해 웹에서 직접 차트를 구현해보고 있습니다. 

 

 

차트데이터들은 여러 라이브러리를 탐구해보고 있는데

 

예시로 가져온 차트정도도 괜찮은 것 같습니다. 결국 예측데이터들을 잘 볼 수 있기만 하면 되니까요 

 

이렇게 추론데이터를 웹에 가져와서 시각화하는 것까지 완성되었습니다. 

 

이제 여러분들의 조회 조건에 맞게 데이터를 그려줄 수 있는 도구들은 다 만들어진 셈입니다. 

 

물론 모델의 성과(수익), 더 다양한 모델들의 시각화, 기능들이 추가될 예정이지만

 

구현된 도구들을 잘 조합해서 서비스기능을 잘 수행할 수 있도록 묶어내는 작업이 우선적으로 필요할 것 같습니다. 

 

 

마무리

 

오늘은 학습한 모델의 추론과 데이터 연동, 시각화까지 개발중점의 내용들을 보여드렸습니다. 

 

사실 제가 예전부터 몸으로 배워오던 소프트웨어개발의 전반적인 것들이 이 콘텐츠에 많이 담겨있는 것 같습니다. 

 

취업을 걱정하던 시기에 여러 프로젝트를 하면서 웹개발과 서버개발과 AI 영역까지 너무 다양하게 공부하면서

 

한 분야에 깊이가 없는 개발자가 되는 건지 걱정한 적 있는데

 

취업시장에선 개발자란 사람을 하나의 도구처럼 "서버개발자 1", "웹개발자 1"로 여길 수 있겠지만

 

정말 시장에서 가치를 만들어내는 도구와 시스템 사업체를 위해선 그런 도구들을 모두 활용하거나 응용해야 함을 느낄 수 있고

 

나무가 아니라 숲을 보기 위해 여러 개발 경험을 쌓아온 과거의 제가 없었다면 이런 서비스를 스스로 구현할 순 없었을 것 같습니다. 

 

저에게 조언을 구하는 많은 학생, 개발자 여러분들에게 저따위가 감히 말하자면

 

남들이 정한 기준이 아니라 여러분들이 좋아하는 것, 가슴 뛰는 일들을 찾아서 노력하면

 

당장이 아니라도 그런 길을 시장이 인정해주지 않더라도 

 

언젠가 원하는 결과가 보이기 시작하고 지금 하는 걱정은 자신감이 될 수 있는 것 같습니다. 

 

물론 그 과정에 내가 올바른 길을 가고 있는지,

 

수백 수천번의 고민과 자아성찰의 과정이 수반되어야 하는 것 같습니다. 지금의 저도 물론이고요

 

아무튼 오늘 이렇게 JeTech Lab의 구현체들을 대충 보여드렸습니다. 

 

다른 포스트들과는 다르게 개발중점의 내용을 보여드려 재미없으시고 지루할 수 있지만

 

앞으로는 롱폼 영상에선 이런 개발을 곁들인 설명들을, 숏폼 영상에선 AI의 시장분석 공유를 다뤄가면서 

 

여러분들과 함께하는 시장참여자가 되도록 하겠습니다. 

 

앞으로도 좋은 데이터와 연구로 찾아뵙도록 하겠습니다. 

 

감사합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형