도전 진행 중

인공지능 모델 개발과 서비스 제공을 위한 플랫폼 개발을 같이 해보면서,

개인적으로 서비스 플랫폼 개발하는 것에 더 흥미를 느꼈다.

 

처음 입사해서 만든 플랫폼 코드를 틈틈히 뜯어 고치다가 최근에 2달여에 걸쳐서 통신 방식들을 뜯어 고치면서 웹서비스를 만들어 보고 싶은 생각이 들어 클론 코딩 강의를 따라 들어보고있다.

 

일단 새로운 것을 하니 즐겁다!

 

목표는 트위터 클론코딩 강의를 마치고, 해당 강의를 통해 배운 ReactJS를 활용해서 일종의 개발자 SNS 페이지를 만들어보고 싶다. Python으로 간단한 백엔드 구성은 해보았으니, 좀 더 웹 서비스 다운 백엔드를 만들기 위해 공부하다보면 잘 되지 않을까?

 

2023년 완성을 목표로 시작해본다.

'기타 잡설' 카테고리의 다른 글

2020년 08월 06일 블로그 시작  (0) 2020.08.06
Posted by EnergyCastle
,

Transformer를 한줄로 요약하면,

Attention만으로 모든 문제를 해결 할 수 있다.

이것입니다.

 

Transformer

 

논문에 나온 주요 개념들을 한번 훑어보겠습니다.

 

논문 참조

- Encoder and Decoder Stacks

"Transformer" Architecture는 기본적으로 Encoder - Decoder 구조 입니다.

단지 일반적인 RNN기반의 Encoder-Decoder 구조에서 Encoders-Decoders로 변화한 것입니다.

논무네서는 Encoder 6개 Decoder 6개를 쌓았다고 되어있습니다.

 

- Attention

논문 참조

* Scaled Dot-Product Attention

"Attention Is All You Need"

Figure 2 좌측에 나온 Scaled Dot-Product Attention은 일반적인 Dot-Product Attention에서 √dk 로 나눈것 입니다.

dk는 K벡터의 차원을 의미합니다.

Scaled Dot-Product Attention은 Q벡터(행렬)와 K벡터(행렬)를 곱하고, K벡터의 차원의 루트값으로 스케일링하고 이를 Softmax함수를 통해 비율로 변환한뒤 V벡터(행렬)에 곱하는 것입니다.

 

* Multi-Head Attention

 Figure 2 우측의 그림에 나온 Multi Head Attention은 어텐션을 한번에 여러번 병렬적으로 취하겠다는 의미입니다.

여러번 병력적으로 진행한다는 것의 의미는 여러개의 어텐션을 이용해서 문장을 다양한 시각으로 분석하겠다는 것입니다.

 

* Positional Encoding

Transformer는 no recurrence and no convolution입니다.

따라서, 모델에게 위치에 대한 정보를 주입해 주어야합니다.

위 식에서, pos는 단어가 가지는 위치, i는 그 단어 임베딩 벡터 내부의 인덱스를 의미합니다.

i가 짝수일 때는 sin함수를, 홀수 일 때는 cos함수를 사용합니다.

논문에서는 훈련중에 나타나는 더 긴 시퀀스 길이에 대한 추론을 가능하게 하기 때문에 sinusoidal 함수(sin, cos)을 사용했다고 합니다.

Posted by EnergyCastle
,

현재 Deep Learning에서 자연어 처리에서 시작하여 다양한 분야에서 다양하게 응용되는 Transformer Architecture를 이해하기 위해서 우선 Attention에 대한 이해가 필요합니다.

 

Attention 기법을 한줄로 설명하자면,

전체를 살펴보고, 중요한 것에만 집중해서 결과를 만들자!

위 한줄로 끝입니다.

 

 

"NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE" 논문에서 저자는 RNN Encodder-Decoder 구조를 보완하기 위해 Attention 기법을 적용시킵니다.

(논문에서 저자는 이를 RNN_search 모델이라고 명명합니다.)

※원문 : https://arxiv.org/pdf/1409.0473.pdf

 

기존 Encoder-Decoder 모델에서는 하나의 고정된 크기의 벡터로 문장을 변환하면서 정보의 손실이 생기게 되고, 이로 인해 긴 문장에서 품질이 좋지 않았습니다.

 

이를 보완하기 위해 Encoder-Decoder 구조를 기반으로 전체 문장을 참고하면서 중요한 단어에 집중 할 수 있도록 만들어 주는 Attention 기법이 등장하게된 것입니다.

 

출처 : https://arxiv.org/pdf/1409.0473.pdf (논문 원본)

 

여기서 h가 나타내는 것은 Encoder의 hidden state이고, sDecoder의 hidden state 입니다.

이 그림의 의미는 Encoder의 모든 hidden state를 참고해서 Decoder의 출력이 결정된다는 것입니다.

이 때 Decoder는 a를 통해서 점수가 매겨진 Encoder 정보를 받게 됩니다.

 

이러한 Attention 기법을 통해 긴 문장에 대해서도 높은 품질을 유지할 수 있게 되었습니다.

 

아래에 논문을 이해하는데 많은 도움이 된 링크를 하나 첨부해 드립니다.

아래 글에 정말 자세하고 친절하게 설명이 되었으니, 이 글을 읽는 분들께 더 많은 도움이 되었으면 좋겠습니다.

 

감사합니다.

 

glee1228.tistory.com/3glee1228.tistory.com/3

Posted by EnergyCastle
,

Python에서 ffmpeg 를 사용할 때에는 여러 주의점이 있습니다.

본 글은 windows 환경에서의 ffmpeg 사용 tip입니다.

 

1. Python Code 실행 경로에 반드시 ffmpeg 파일 존재.

pip install ffmpeg

 위 명령어를 이용해 ffmpeg를 설치하고 Python Code를 실행하셔도 ffmpeg가 존재하지 않는 다는 식의 에러가 발생 할 것입니다. 이와 같은 문제를 해결하기 위해서는 현재 실행할 .py파일과 같은 경로상에 ffmpeg.exe 파일이 존재하여야 합니다.

 

2. Log level 조정.

ffmpeg -loglevel "error" -i (input) ...

    "quiet"
    "panic"
    "fatal"
    "error"
    "warning"
    "info"
    "verbose"
    "debug"

loglevel을 통해 ffmpeg 실행 중에 표시되는 로그의 자세한 정도를 조절 할 수 있습니다.

 

3. Command 창 실행 안되게 하기.

Python Code 상에서 ffmpeg를 사용하는 것은 나의 코드가 ffmpeg 프로그램을 실행시켜서 처리하는 작업입니다.

그렇기 때문에, 실행환경에 따라서 Command창이 자동으로 생성될 수 있습니다.

 특히, pyinstaller 등을 통해서 GUI가 포함된 exe파일을 생성하였는데, 불필요한 Command 창이 실행된다면 매우 난감한 상황이 벌어지게 됩니다.

 

ffmpeg -hide_banner

위 옵션을 통해 해결된다면 좋겠지만, 그렇지 않다면

pip 를 통해 설치한 ffmpeg 패키지 코드를 수정해야 합니다.

ffmpeg package 폴더로 이동 (eg, python_path/site_pakages/ffmpeg)

"_run.py" 열기

"def run_async" 찾기

run_async 함수의 return 부분에 creationflags 옵션 추가

return subprocess.Popen(
        args, stdin=stdin_stram, stout=stout_stream, stderr=stdderr_stream, creationflags=0x08000000
    )

위와 같은 작업을 통해서 command 창 생성을 막을수 있습니다.

'Python' 카테고리의 다른 글

Python 파일 실행 옵션 만들기  (0) 2020.08.18
Python FTP 활용하기  (0) 2020.08.08
Posted by EnergyCastle
,

01. 간단 예제

 

Python 코드를 작성하고, 실행할 때 각종 변수에 해당하는 값들을 바꿔가며 실행해야 될 경우가 있습니다.

 

혹은 외부 프로그램이 내 파이썬 코드를 실행한다고 하면, 상황에 맞게 마치 함수처럼 내 코드 전체를 실행하고 싶을 수 있습니다.

 

Python 에서는 이러한 상황에서  argparse를 이용해서 간편하게 실행할 때 입력해 줄 수 있는 옵션을 지정 할 수 있습니다.

argparse 예제 - 1

 

위와 같이 argparse를 통해 파이썬 실행시 입력되는 문자열을 파싱하여 그 값을 읽어오고 코드 내부에서 사용할 수 있습니다.

 

argparse 예제 - 1 실행결과

argparse를 이용하면 이렇게 쉽게 실행 옵션을 삽입 할 수 있습니다.

특히, 프로그램을 실행하는 과정에서 주고받는 데이터가 저장되는 경로나 출력이 저장될 경로는 수시로 바뀔 수 있기 때문에 옵션으로 처리해두면 추후에 변경사항에 대해서 유연하게 대처하기 쉬워집니다.

이 외에도, 중요 함수들의 입력값을 미리 옵션으로 처리해두면 코드를 변경하지 않고, 함수에 입력 값들을 변경하면서 사용 가능합니다.

 

02. 옵션으로  list 처리하기

'str', 'int', 'float' 등의 자료형 이외에 리스트를 입력으로 넣고 싶은 경우가 많습니다.

하지만 type에 list를 입력하고, 실제 실행할 때 리스트 형태의 입력을 던져주면 에러가 발생합니다.

argparse 예제 - 2
default 값에선 인식하는데 실제 옵션으로 사용하면 error 발생!?

 

list 를 입력으로 받기 위해서는 추가로 nargs='+'라는 옵션이 필요합니다.

 

argparse 예제 - 2 수정
옵션으로 list 사용하기

 

type을 그대로 list로 두고 nargs='+'를 넣으면, 연속된 숫자를 하나의 행으로 하는 리스트 타입이 만들어 지기도 합니다.

 

type=list, nargs='+'
띄어쓰기를 통해 행을 구분

 

알아두시고 상황에 따라 적절하게 사용하시면 좋을 것 같습니다.

 

마지막으로 list를 사용하는 부분에 관련하여 참고한 링크를 첨부합니다.

https://stackoverflow.com/questions/15753701/how-can-i-pass-a-list-as-a-command-line-argument-with-argparse

 

How can I pass a list as a command-line argument with argparse?

I am trying to pass a list as an argument to a command line program. Is there an argparse option to pass a list as option? parser.add_argument('-l', '--list', type=list, acti...

stackoverflow.com

 

감사합니다.

'Python' 카테고리의 다른 글

[Python] ffmpeg 커맨드창 실행 안되게 하는 방법  (0) 2020.10.26
Python FTP 활용하기  (0) 2020.08.08
Posted by EnergyCastle
,

Python FTP 활용하기

Python 2020. 8. 8. 09:27

Python에서는 간단한 방법으로 FTP에 접속해서 데이터를 다운로드 받고 혹은 업로드 할 수 있습니다.

 

바로,

ftplib 라는 라이브러리를 활용하는 방법 입니다.

 

ftplib 사용법

import ftplib

ftp = ftplib.FTP()
ftp.connect(host='ftp ip address', port=21)
ftp.login(user='user_id', passwd='user_pw')


# Download 받을 파일을 wb(write binary) mode 로 열어줍니다.
download_file = open('file.dat', 'wb')


# RETR은 FTP 명령어로 다운로드 받기 위한 명령어입니다.
ftp.retrbinary('RETR /file_path', download_file)


# Download가 완료되면 파일을 닫습니다.
download_file.close()


# Upload 받을 파일을 rb(read binary) mode 로 열어줍니다.
upload_file = open('file.dat', 'rb')


# STOR은 FTP 명령어로 업로드 하기 위한 명령어입니다.
ftp.storbinary('STOR /file_path', upload_file)


# Upload가 완료되면 파일을 닫습니다.
upload_file.close()

위와 같이 간단하게 FTP에 접속하여 파일을 다운로드 받거나 업로드 하는 기능을 구현할 수 있습니다!

 

 

FTP login 상황에서 id와 pw가 정확하지만 로그인이 안된다면,

FTP 서버 측에서 설정을 확인해 보시기 바랍니다.

 

ftp.retrbinary 혹은 ftp.storbinary가 550 fail error가 발생할 경우 FTP에 접속하는 계정이 경로를 접근하는데 문제가 있을 수 있습니다. FTP 서버에서 경로 접근 권한에 대한 부분을 확인해 주세요.

 

Python에서 FTP로 접속하고, 파일 다운로드 및 업로드하는 기능을 구현하는 건 매우 쉽습니다.

다소 어려운 문제는 사실 FTP 서버를 구축하는 일이라고 생각됩니다.

 

https://energycastle.tistory.com/4

 

Linux(Ubuntu) FTP server 구축하기

Ubuntu 18.04 버전을 중심으로 작성한 문서입니다. 처음으로 FTP 서버를 구축해보면서 몇가지 시행착오를 겪으며 최종 정리를 하겠습니다. 우선 vsftpd를 이용하면 간단하게 FTP 환경을 구성하고 설정

energycastle.tistory.com

Ubuntu에서 FTP 서버를 구축하는 법에 대해서는 제가 간단하게 정리해놓은 글이 있습니다.

해당 글을 보면서 차근차근 해보시면 어렵지 않게 FTP 서버를 만들고 Python으로 파일을 주고 받을 수 있을 것 입니다.

'Python' 카테고리의 다른 글

[Python] ffmpeg 커맨드창 실행 안되게 하는 방법  (0) 2020.10.26
Python 파일 실행 옵션 만들기  (0) 2020.08.18
Posted by EnergyCastle
,

Ubuntu 18.04 버전을 중심으로 작성한 문서입니다.

 

처음으로 FTP 서버를 구축해보면서 몇가지 시행착오를 겪으며 최종 정리를 하겠습니다.

 

우선 vsftpd를 이용하면 간단하게 FTP 환경을 구성하고 설정 할 수 있습니다.

전체적으로 간략하게 필요한 명령어 및 구성은 아래와 같습니다.

vsftpd 설정 가이드

sudo apt install vsftpd


sudo nano /etc/vsftpd.conf

    listen=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    connect_from_port_20=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
    utf8_filesystem=YES
    pasv_enable=YES
    pasv_min_port=50000
    pasv_max_port=51000

ctrl+x >> y >> enter (편집한 내용 저장)

sudo nano /etc/vsftpd.chroot_list

    user_id 추가

ctrl+x >> y >> enter (편집한 내용 저장)

sudo nano ftpusers

    root >> #root

    (root를 주석처리 함으로 ftp에 root계정 접근 허용)

ctrl+x >> y >> enter (편집한 내용 저장)

ufw allow 21/tcp

ufw allow 50000:51000/tcp


ufw reload

 

위 순서로 진행하면 21번 포트로 FTP 접속이 허용됩니다.

WinSCP나 파일질라등을 통해서 FTP 접속이 원활하게 이루어지는지 확인해 보십시오.

 

그러면 각 명령어마다 간단한 설명을 붙여보겠습니다.

 

sudo apt install vsftpd
vsftpd를 설치합니다.
sudo nano /etc/vsftpd.conf
vsftpd의 설정을 편집하는 작업입니다.
저는 간단하게 nano 편집기를 사용했지만, vim이나 다른 기타 편집기로 편집하셔도 무방합니다.
listen=YES ipv4로 들어오는 요청을 수락합니다.
local_enable=YES 로컬 계정 사용자의 접속을 승인합니다.
write_enable=YES 사용자가 파일을 쓸 수 있습니다.
FTP에 파일을 업로드 하기 위해서 필요합니다.
local_umask=022 로컬 계정 사용자가 생성한 파일에 대한 권한 설정 부분입니다.
connect_from_port_20=YES 20번 포트로도 접속을 허용하겠다는 의미입니다.
chroot_local_user=YES 로컬유저가 root경로로 접근하는 것을 허용합니다.
특정 프로그램 실행을 통해 자동으로 로그나 데이터를 업로드하는 경우,
허용해주는 것이 편리합니다.
chroot_list_enable=YES
chroot를 할 수 있는 유저 목록을 관리합니다.
chroot_list_file=/etc/vsftpd.chroot_list /etc 경로 아래에 vsftpd.chroot_list라는 파일이 없다면,
그냥 해당 경로에 직접 파일을 생성하고 원하는 계정명을 입력하면 됩니다.
utf8_filesystem=YES utf8 인코딩을 사용합니다.
pasv_enable=YES FTP는 Active mode와 Passive mode가 존재하는데, passive mode도 사용한다는 의미입니다.
python의 ftplib를 이용해서 파일을 업로드 시킬때 passive mode가 꺼져있으면 접속이 안되어서, passive mode를 enable하고, 해당 포트도 방화벽에서 같이 열어두어야 합니다.
pasv_min_port=50000 passive mode로 접근할 포트 하한 범위
pasv_max_port=51000 passive mode로 접근할 포트 상한 범위
sudo nano /etc/vsftpd.chroot_list
위에서 chroot_list를 사용하기로 했다면, 해당 파일에 사용자 계정명을 입력해주어야 합니다.
sudo nano ftpusers
vsftpd.conf 파일의 설정에 따라서 ftpusers의 내용이 정반대가 될 수 있음을 주의하셔야 합니다!
기본 설정에서는 ftpusers 내부에 있는 계정명은 접근이 불가합니다.
root 계정을 이용해서 FTP에 접근하고 싶다면, root 앞에 #을 붙여 주석처리하고 저장하시면 됩니다.
ufw allow 21/tcp
ufw allow 50000:51000/tcp

ufw reload
ubuntu 18.04(아마도 16.04버전 부터)는 ufw를 이용해서 간단하게 방화벽 설정을 바꿀 수 있습니다.
해당 커맨드들을 통해 21번, 50000~51000(passive 연결)을 허용하고, 방화벽을 다시 읽어와서 바로 적용 할 수 있습니다.

 

저는 파이썬 코드를 이용해서 오디오 특징 추출을 진행하고,

그 결과를 FTP 서버에 업로드 하기 위해서 FTP 서버를 구축했습니다.

 

WinSCP로 접속이 잘되는데도 파이썬 코드를 실행하면 접속이 안되거나, 파일 업로드 및 다운로드가 안되어서 반나절을 고생했습니다.. ㅠㅠ

 

vsftpd를 이용하면 정말 쉽게 FTP 환경을 구축할 수 있습니다!

인터넷 검색 활용도 좋지만 우선 vsftpd.conf 파일 내부의 주석부터 꼼꼼히 읽어보는게 중요한 것 같습니다...

설명을 제대로 읽지도 않고 무작정 하라는대로 따라만했더니 문제가 생길때 어디서부터 손대야될지를 몰라 더 고생한 것 같습니다... 쉬워보이는 문제도 역시 그 원리를 알고 풀어야 진정 내 것이 되는 것 같습니다.

 

하지만, 저도 아직 초급 개발자로서 혹시 잘못된 내용이 있다면 댓글로 알려주시면 최대한 빠르게 읽고 수정하겠습니다.

 

그리고,

python을 이용해서 ftp를 활용하는 것에 대해서도 조만간 정리해서 올리도록 하겠습니다.

 

감사합니다!

'Linux' 카테고리의 다른 글

Windows와 Linux 에서 작성한 .sh 파일의 차이  (0) 2020.08.06
Posted by EnergyCastle
,

간단한 쉘 스크립트를 작성하면서 처음 접한 가장 큰 문제였습니다.

 

쉘 스크립트를 실행하면 그 안에서 python 프로그램을 실행시키도록 만들었는데,

어째서인지 argparse를 이용해 만들어둔 옵션들을 쉘 스크립트가 실행할 때 똑바로 인식하지 못하는 것입니다.

 

몇시간동안 대체 무엇을 잘못했는지 찾다가 의외로 해결책은 가까운 곳에 있었습니다.

 

https://www.snoopybox.co.kr/1613

 

윈도우에서 작성한 Shell 스크립트 리눅스에서 에러나는 경우

윈도우에서 메모장으로 작성한 Bash 스크립트 파일을 리눅스에 넣어 돌리면 오류가 발생합니다. 그 이유는 DOS와 UNIX 계열의 개행 방식이 서로 다르기 때문인데요, 눈에 보이지는 않지만 각 줄의 �

www.snoopybox.co.kr

윈도우에서는 문장 마지막에 커서를 문장 시작부분으로 옮기는 \r이 붙어있다는 사실을 처음 알았습니다.

 

결론부터 말하자면,

Windows -> Linux

sed -i -e 's/\r$//' file.sh

Linux -> Windows

sed -i -e 's/$/\r/' file.sh

 

위의 명령어를 통해서 .sh파일의 문장들을 간단하게 수정한 후 실행하면 정상적으로 작동하게 됩니다.

 

간략하게 설명해보자면,

  • sed 명령어의 경우 정규표현식을 이용해서 단순 반복작업을 간단하게 끝내버릴수 있는 명령어입니다.
  • $는 정규 표현식에서 문장의 끝을 의미하고, 따라서 \r$은 \r이 문장 끝에 등장한다는 의미가 됩니다.

sed의 옵션에 대해서는 잘 정리해 놓은 블로그 링크를 첨부합니다.

https://m.blog.naver.com/PostView.nhn?blogId=int_s&logNo=220483567708&proxyReferer=https:%2F%2Fwww.google.com%2F

 

01. sed 옵션 정리

- p 명령 : 출력 sed '/north/p' datafile -기본적으로 모든 줄을 출력하고, 패턴과 일치하는 줄을 한번 더...

blog.naver.com

 

'Linux' 카테고리의 다른 글

Linux(Ubuntu) FTP server 구축하기  (0) 2020.08.07
Posted by EnergyCastle
,