jsup.GEN - AI를 이용한 이미지 -> 이미지 생성 검토

Image
by joviansummer original STEEMIT post: https://steemit.com/blog/@joviansummer/4dl3wg-jsup-gen-ai jsup.GEN 실험 - 스팀잇에서 AI 기반 이미지 생성 현재 jsup.GEN 서비스는 텍스트 프롬프트(prompt)로부터 이미지를 생성하는 기능을 가지고 있습니다. 이것은 나름 흥미로운 기능이긴 하나, 영문으로 다수의 키워드를 입력해서 원하는 이미지를 구체적으로 설명해야 하기 때문에 생각하는 결과물을 만들어 내기가 그리 쉽진 않습니다. 따라서, 이미 존재하는 이미지를 기준으로 삼아서 특정한 스타일의 이미지를 생성하는 기능이 효용성 측면에서는 좀 더 우수할 것 같습니다. 이미지로부터 이미지를 생성하는 기능을 검토하고 있는데, 2가지 방법을 생각하고 있습니다. 첫번째 방법은 아래와 같이 2개의 명령어를 구현하는 것입니다. !gen_t : 이 명령어는 텍스트 프롬프트에 더 비중을 두고 이미지를 생성합니다. 입력하는 이미지를 기준으로 삼지만 텍스트 프롬프트로 지정한 내용의 영향이 크게 작용합니다. !gen_i : 이 명령어는 입력 이미지에 더 비중을 두고 이미지를 생성합니다. 따라서 출력 이미지는 입력 이미지와 매우 비슷하며 텍스트 프롬프트에 의해 약간의 수정이 가해진 형태로 생성됩니다. 두번째 방법은 !gen_i 명령어 하나만 제공하고, 위의 2개 명령어 사이의 적당한 중간 지점의 비중을 찾아서 설정하는 것입니다. 어떤 방법을 선택해서 사용하던지 실험을 좀 많이 해 봐야 될 것으로 보입니다. AI쪽에 익숙하지 않아 생소하다는 문제도 있고 아직 작업이 많이 진행되지 않았기 때문에, 실제로 이 명령어들을 성공적으로 구현할 수 있을지 어떨지는 확실치 않습니다. 그러나 어쨌든 작업은 시간이 나는대로 계속 진행해 보려고 합니다. 감사합니다. @joviansummer의 스팀 프로젝트 스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다. ( h...

파이썬 + 스팀: 반복적으로 API 노드에 접속할 때 고려할 점

by joviansummer
original STEEMIT post: https://steemit.com/blog/@joviansummer/api


스팀 블럭체인으로부터 정보를 얻기 위해 API 노드에 요청을 보낼 경우, 일회성으로 접속하는 경우에는 별 문제가 없지만 while 또는 for 반복문을 통해서 반복 접속할 경우에는 응답이 제대로 오지 않을 수 있습니다.

예를 들어 특정 스팀 계정에 대한 어떤 정보를 조회하기 위한 함수 func_test()가 있다고 가정해 보겠습니다. 인자(argument)로 스팀 계정을 받아서 API 노드로부터 어떤 정보를 조회한 결과를 돌려주는 기능을 한다면, 아래와 같은 코드를 만들어 볼 수 있겠습니다.

steem_id = 'joviansummer'
result = func_test(steem_id)
print(result)

위의 경우에는 별 문제가 없지만, 예를 들어 100개의 스팀 계정을 리스트(list) 형식으로 가지고 있다면 이들의 정보를 조회하기 위해 아래와 같은 코드를 만들 수 있습니다.

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  result = func_test(steem_id)
  print(result)

코드 자체로는 전혀 문제가 없어 보이지만, 실제로 이러한 코드를 실행해 보면 API 노드에서 처음에는 정상적으로 응답이 오다가 어느 순간 제대로 응답이 오지 않는 경우가 발생할 수 있습니다. 아마도 한꺼번에 과도한 요청이 온다고 판단될 경우 접속에 제한을 하는 것으로 보입니다. 제대로 응답을 받지 못할 경우 API 접속 관련 파이썬 모듈에서 다섯번까지 재시도를 합니다만 결국 응답을 받지 못하는 경우도 발생합니다.

일단 첫번째로 생각해 볼 수 있는 해결책은 API 노드에 좀 더 공손하게(?) 요청을 하는 것입니다. time.sleep() 함수를 이용해서 각 요청마다 약간의 시간 지연을 추가해서 조금 천천히 요청을 보내는 것인데요. 이것만으로도 응답 수신 실패 가능성을 상당 부분 해결할 수 있습니다. 예를 들어 0.2초마다 한번씩 요청을 하려면 코드는 아래와 같이 되겠죠.

import time

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  result = func_test(steem_id)
  print(result)
  time.sleep(0.2)

그래도 안심이 되지 않는다면, 무한 루프를 이용해서 제대로 된 응답이 올 때까지 기다리게 할 수도 있겠습니다. 결과를 받은 후 결과의 내용을 검증하는 부분이 추가되어야 겠죠. 예를 들어 결과를 검증하는 함수를 chk_res()라는 이름으로 만들어서 문제가 없으면 "OK"를 반환하고 문제가 있으면 "ERROR"를 반환한다고 가정하면 코드가 아래와 같이 될 수 있습니다. 응답을 받은 결과가 정상이면 while 무한 루프를 빠져나오고, 문제가 있으면 5초후에 다시 시도하는 형태입니다.

import time

account_list = ['joviansummer', 'jsup', 'jswit', ... ]
for steem_id in account_list:
  while True:
    result = func_test(steem_id)
    result_chk = chk_res(result)
    if result_chk == "OK":
      break
    else:
      time.sleep(5)
      continue
  print(result)
  time.sleep(0.2)

API 노드와 통신이 항상 완벽하다는 보장이 없기 때문에, 시험용이 아니라 실제로 사용할 목적으로 파이썬 코딩을 한다면 위와 같은 상황에 대한 고려가 반드시 필요합니다. 또한 위의 예시에서 func_test() 함수의 실제 내용에는 API 노드와 통신하는 부분이 포함될텐데, 이 부분에서도 예외(exception) 처리를 위한 코드가 반드시 필요합니다. 이와 관련된 내용은 이전에 작성한 포스트를 참고하시기 바랍니다.

파이썬 beem에서 인터넷 회선 또는 API 노드 불안정성에 대한 대응


@joviansummer의 스팀 프로젝트

스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다.
(https://steemitwallet.com/~witnesses)

jswit 증인 노드 프로젝트를 시작합니다.

jsup 업보팅(upvoting) 서비스 소개

jsup 수혜자 지정 기능 추가

jSTEEM 프로젝트 - 텔레그램 챗봇으로 구현하는 스팀 블럭체인 탐색기

STEEM.NFT - 디지털 아트 보존 프로젝트

Comments

Popular posts from this blog

스티미언의 영향력 지수 계산

jsup/avle code update - you don't have to write post everyday

jsup/avle 보팅 코드 갱신 - 1일1포스팅 강박에서 벗어나기