소개
(전) 엔코아 컨설팅
(전) 한국 오라클
AI 프리랜서 컨설턴트
파이썬 머신러닝 완벽 가이드 저자
강의
로드맵
전체 3수강평
- FastAPI 완벽 가이드
- 데이터 분석 SQL Fundamentals
게시글
질문&답변
소프트맥스 관련 질문입니다
안녕하십니까,다시 여기서 뵙게 되는 군요. 반갑습니다^^예전에 pytorch로 질문주셨는데, 다시 TF로 질문을 올리셨군요.아, 하드웨어 분야를 전공으로 하셨군요. 이제 질문이 연관이 됩니다. 제가 '소프트맥스 연산에 대한 하드웨어 가속기 설계 연구'가 뭔지 몰라서 검색해 봤더니, 정말 이런 논문이 있더군요. 근데 제가 하드웨어 쪽은 몰라서, 가속기 설계 연구에 도움이 될 지 모르겠습니다.먼저 좀 쉬운 질문 부터 답변 드리겠습니다.네 맞습니다. logit의 argmax 결과나 logit을 softmax 적용 후 argmax 결과가 동일합니다. 그럼에도 불구하고 사용하는 이유는 첫째로 예측 확률을 계산하기 위해서 입니다. 그러니까, 가장 높은 예측값을 기반으로 해당 클래스값을 예측하지만, 예측 확률 또한 얻기 위할 때 사용됩니다. 두번째로 Loss 함수에 입력시 사용될 수 있습니다(이게 좀 헷갈립니다). Pytorch를 사용하신다면 nn.CrossEntropy의 입력 인자로 logit 값을 넣어줘야 하며, softmax를 적용하면 안됩니다. nn.CrossEntropy 내부에서 softmax를 적용하기 때문에 입력 인자로 softmax 적용된 tensor를 넣으면 두번 softmax가 적용되게 됩니다. Tensorflow의 경우 CategoricalCrossEntropy는 인자로 logit을 넣을 지, logit에 softmax가 적용된 값을 넣을지 구분값이 있습니다. default는 logit에 softmax가 적용된 값을 넣는 것입니다. 그래서 어떤 framework 을 쓰느냐에 따라 헷갈리는 부분이 있습니다.2. 딥러닝 모델로 생성되는 logit값 범위는 그렇게 크지는 않습니다. 보통 이미지 데이터를 입력할 경우 픽셀값을 0 ~ 1로 정규화 하고, weight들의 값이 매우 작기 때문에 logit 값은 일반적으로 소수점 이하입니다.제일 중요한 1번 답변을 정확히 드리기가 어렵군요. 왜냐하면 Deep Learning 모델에서 Softmax Layer만 별도의 정밀도를 유지하는 경우는 제가 보질 못했습니다. 보통은 학습 파라미터(Weight, bias)와 Activation 출력값을 모두 정밀도를 낮추는 것을 수행하지만, Softmax Layer만 S/W적으로 정밀도를 낮추는 것을 적용하지는 않습니다. 이것만 낮춘다고 H/W 리소스를 절약할 것 같지 않습니다. 보통 Weight등의 tensor는 float32 입니다. 이걸 인위적으로 float16으로 낮추면 성능이 많이 떨어집니다. Deep Learning은 정밀도가 꽤 중요한 편입니다.Float16으로 성능 저하를 최소로 하면서 S/W적으로 낮출때는 Pytorch는 AMP(Automatic Mixed Precision), TF는 Mixed Precision Policy를 이용합니다. 근데 이건 S/W적인 것이고, AMP등이 동작하려면 H/W에서 지원이 되어야 합니다(NVIDIA, TPU 모두 지원됨)H/W를 전문으로 하시는 지라, 제 답변이 도움이 될지 모르겠습니다. 더 궁금하신 점 있으시면 여기에 다시 글 부탁드립니다.감사합니다.
- 0
- 1
- 36
질문&답변
put, patch, delete에 대해 질문 드립니다.
안녕하십니까,FastAPI가 지원을 안 하는게 아니라 HTML이 PUT/PATCH/DELETE HTTP Method를 지원하지 않습니다. HTML Form 태그는 POST/GET 만 지원하므로 HTML을 파싱해서 Request를 올리는 브라우저 기반에서는 PUT/PATCH/DELETE Method를 요청할 수 없습니다.때문에 Method override와 같이 Form 태그에 약간의 꼼수(?)를 적용한 뒤 이를 미들웨어에서 파싱/해석하여 FastAPI의 @app.put, @app.patch @app.delete등으로 PUT/PATCH/DELETE를 수행하는 것입니다(Express js와 같은 타 웹 프레임워크도 이와 유사한 방식으로 처리합니다)브라우저 기반이 아닌 다른 REST API Client 예를 들어, Thunder Client나 Postman은 HTML기반이 아니므로 PUT/PATCH/DELETE 요청을 바로 FastAPI에 수행할 수 있습니다.강의에서 위 내용으로 설명을 드리오니, 다시 한번 강의를 보시면 좋을 것 같습니다.감사합니다.
- 0
- 1
- 20
질문&답변
동영상 및 보이스 실시간 전송 관련 문의 드립니다.
안녕하십니까, 일반적으로 Kafka는 IOT 기반의 센서 데이터 연동에는 잘 활용되지만, 동영상/보이스 데이터 용으로는 잘 활용되지 않습니다. Kafka는 Event, 센서, 정형 또는 반정형 데이터, 로그 데이터를 위한 메시징 시스템 용도로 활용되지만, 동영상과 같이 큰 데이터나 동영상을 스트리밍 방식으로 저장할 때는 잘 사용되지 않습니다. 그리고 '동영상 이나 보이스 는 실시간으로 받는 방법으로는 kafka 말고 다른 것을 사용 하나요?'는 동영상 전송과 메시징 서버 역할은 다릅니다. 아쉽게도 제가 동영상 전송 전문가는 아니어서 다른 방식은 잘 모르겠습니다. 감사합니다.
- 0
- 1
- 17
질문&답변
m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?
안녕하십니까, cross join은 조인 연결 조건이 없어도 무조건 두 테이블을 연결합니다. 가령 A 테이블이 100건 , B 테이블이 10,000 건의 데이터가 있으면 무조건 개별 데이터가 서로 조인으로 연결되므로 백만건이 조인 결과로 나오게 됩니다(물론 이후에 필터링 조건으로 걸러낼 수는 있지만)Inner join은 조인의 연결키로 서로 연결을 하는 것입니다. 다만 조인의 연결키로 M:N 레벨이 되어서 1:M과 다르게 M쪽 집합의 레벨로 조인이 만들어 지는게 아니라, M쪽 집합, N집합 모두에 조인키로 중복되게 조인 결과가 만들어 집니다.가령 A 테이블이COL_1 COL_21 가2 나2 다B 테이블이COL_1 COL21 A1 B2 C2 C라면 A와 B 테이블의 SELECT A.COL_1, B.COL_1, A.COL_2, B.COL_2FROM A INNER JON B ON A.COL_1 = B.COL_1 이라면 COL_1 조인 컬럼 기준으로 M:N 조인이 되어서 아래와 같이 6개의 레코드가 만들어 지게 됩니다. A.COL1 B.COL_1 A.COL_2 B.COL_21 1 가 A1 1 가 B2 2 나 C2 2 나 C2 2 다 C2 2 다 C하지만 Cross join을 하게 되면 무조건 개별 데이터 들을 다 연결하므로 3 x 4로 12건이 만들어 집니다. Cross join은 무조건 양쪽 테이블을 연결하는 것이고, M:N Inner join은 join에 해당하는 레코드 끼리 연결하는 것입니다. 감사합니다.
- 0
- 1
- 9
질문&답변
Debezium cdc source for MSSQL-Server [등록오류]
안녕하십니까, 제가 MSSQL을 다뤄보진 않아서 정확하게는 모르겠지만, 일단 table.include.list에 대상 table 명이 빠진것 같습니다. 아래는 https://debezium.io/documentation/reference/stable/connectors/sqlserver.html 에서 가져온 sample config 입니다. 비교해서 매칭해 보시면 좋을 것 같습니다. 감사합니다{ "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", "database.hostname": "192.168.99.100", "database.port": "1433", "database.user": "sa", "database.password": "Password!", "database.names": "testDB1,testDB2", "topic.prefix": "fullfillment", "table.include.list": "dbo.customers", "schema.history.internal.kafka.bootstrap.servers": "kafka:9092", "schema.history.internal.kafka.topic": "schemahistory.fullfillment", "database.ssl.truststore": "path/to/trust-store", "database.ssl.truststore.password": "password-for-trust-store" }}
- 0
- 2
- 19
질문&답변
Softmax 관련 질문입니다.
안녕하십니까, 왜 round_to_binary_n_digits()를 적용하시는지요? 이게 softmax 함수나 softmax 결과를 가지고 가공하는 함수로도 보이지 않습니다만,outputs = model(images) 에서 반환되는 것은 softmax 값이 아닙니다. 그냥 logit 값입니다. Model을 어떻게 만드셨는지 모르지만, 모델에서 별도로 출력을 softmax형태로 만드신건가요? 모델을 softmax 출력값으로 출력하도록 만들면 안되는 건 아닌데, loss에서 문제가 생길 여지가 많습니다. 그리고 Softmax의 Input의 정밀도라는 문구를 잘 이해하지 못했습니다. image나 label tensor의 정밀도가 아니라(즉 float32/64)가 아니라 Softmax Input 정밀도가 Softmax Layer만 통과하는 tensor 의 정밀도를 변화시켜서 테스트 하고자 한다면,( 음... 이런 사례가 없어서), 굳이 왜 이런 생각을 하셨는지 여쭤보고 싶습니다. 그리고 round_to_binary_n_digits()가 어떻게 정밀도를 적용하는 것인지도 잘 모르겠습니다(아니면 Softmax Input 정밀도에서 정밀도가 accuracy(정확도)를 의미하는지, 그럼 해당 함수가 완전히 다른 것이어야 할텐데...)요약하면 왜 round_to_binary_n_digits() 하실려는 건지, Softmax Input 정밀도가 뭘 의미하는 건지 다시 한번 기재 부탁드립니다. 감사합니다.
- 0
- 2
- 34
질문&답변
Optional체크를 어느 부분에서 해주고 하지 않아도 되는지 궁금합니다.
안녕하십니까, 잘 듣고 계시다니, 저도 기분이 좋군요. 먼저 /items_form_02/{item_id} 엔드 포인드를 사용하신다면 tax가 Null이면 @model_validator()에서 tax > price 식 때문에 오류가 발생할 것 입니다. tax는 제외하고 description만 말씀드리면, async def update_item_for_02()를 보시면 Depends(parse_user_for)이 인자로 되어 있습니다. 그리고 parse_user_form() 함수의 인자를 보면 description: Annotated[str, Form(max_length=500)] = None 으로 optional 형태로 받아 들이게 되어 있습니다. 그래서 Swagger UI에서는 해당 선언만 보고 Optional 하게 선택할 수 있도록 UI가 만들어 집니다. 이후에 parse_user_form()함수는 인자로 들어온 값을 가지고 Pydantic Item 객체를 생성합니다. 그런데, Pydantic Item 객체의 선언을 보시면 description: str = Field(None, max_length=500) 으로 Optional 하지 않습니다. 요약 드리면 Swagger UI는 수행함수 인자를 보고 Optional UI를 결정하는데, 실제 Optional한 값이 들어가 버리면 Pydantic Item에서 이걸 허용하지 않기 때문에 Pydantic 오류가 발생합니다. 이건 제가 실습 코드를 좀 더 정교하게 만들었어야 하는거 아닌가 하는 생각이 듭니다. 이런 부분까지 확인하실 거라곤 생각을 못했습니다. 좋은 질문 감사드립니다.
- 0
- 1
- 81
질문&답변
rollup
안녕하십니까,group by(1, 2, 3)이라면에서 1, 2, 3이 컬럼명인가요? group by에 해당하는 컬럼들에 우선순위가 매겨지면서 그들의 합을 보는건가요 라는 의미가 어떤 건지 제가 잘 이해를 못했습니다만, 일단 컬럼명이라면 적어놓은 순서대로 rollup이 되지 않습니다.rollup은 group by 를 하되, 소계(소항목) 레벨로 group by를 추가하는 것입니다.그러니까 rollup(dept, job) 이라고 하면 원래 group by dept, job 이면 dept + job 레벨로 group by를 하는 것입니다. 그런데 rollup은 이렇게 group by를 하다가 dept 레벨로 소항목을 퉁쳐서 group by 를 합니다. 그리고 맨 마지막에는 전체 aggregation을 하게 됩니다.여전히 잘 이해가 안되신다면, 강의를 다시 한번 들어보시면 좋을 것 같습니다. 그림으로 설명되었으니, 다시 한번 찬찬히 들여다 보시면 도움이 될 것입니다.감사합니다.
- 0
- 2
- 13
질문&답변
rollback에 대해 질문 드려요
안녕하십니까, SQLAlchemy Engine이 MySQL DB connection close() 될 때 자동으로 rollback()을 수행합니다. auto commit 이 되어 있지 않기 때문에 명시적으로 commit()을 호출하지 않고 close() 되면 insert/update/delete 수행되더라도 DB에 적용되지 않고 rollback() 됩니다. create_blog() 수행함수에서 conn.commit()를 삭제하고 다시 테스트를 해보시면 blog가 생성되지 않는 것을 확인하실 수 있을 겁니다. 감사합니다.
- 0
- 1
- 16
질문&답변
Zookeeper 관련 문의 드립니다.
강의에서는 소개 드리지 않지만, Kafka 신버전(아마도 3.5) 부터는 zookeeper 를 사용하지 않고 zookeper가 수행하는 기능을 KRaft로 대체할 수 있습니다. 기존 zookeeper 보다 좀더 성능적이 측면에서 우수하다고 합니다. 하지만 이건 수십 ~ 수백대 이상의 Kakfa cluster 환경에서의 개선이며, 일반적으로는 성능상 큰 차이가 없는 것으로 알고 있습니다. 아래를 참조해 보시면 좋을 것 같습니다. https://devocean.sk.com/blog/techBoardDetail.do?ID=165711&boardType=techBlog네, 사용가능합니다. 일반적으로 가용성과는 좀 거리가 있습니다. 해당 질문은 바로 이전에 질문하신 내용을 참조하시면 좋을 것 같습니다. 보통은 노드당 1개의 Kafka broker를 적용합니다. 물론 Kubernetes 환경에서 구동된다면 완전히 다른 이야기 이겠지만... 여러개의 topic을 여러 broker에서 개별적으로 사용하는 방식이 성능적으로 더 나은지는 저도 테스트를 안해봐서 잘 모르겠습니다. 개인적인 생각으로는 큰 차이가 없을 것 같습니다만, 장단점은 있을 것 같습니다. 2개의 broker에서 각각 1개씩 topic을 처리하는 경우에 조금 동시접속량을 좀 더 향상시킬 수는 있을 것 같습니다. 물론 2개의 broker를 띄우기 때문에 메모리 사용량이 증가하고 서로 다른 port로 관리해야 되는 부담이 있을 수는 있지만, 성능적인 측면에서는 약간이라도 나을 수는 있을 것 같습니다. 하지만 큰 차이는 아닐 것 같습니다. Kubernetes 기반이 아니라면 굳이 운영에서 docker를 사용할 이유는 없어 보입니다만, docker 로 infra를 구성하는 것이 운영 방안이라면 따르면 될 것 같습니다. docker가 가상환경이기 때문에 성능 저하는 있을 수 있는데 5% 미만 정도로 생각됩니다.
- 0
- 1
- 27