본문 바로가기
Log

Pycon KR 2023 후기

by SmilingSammy 2023. 8. 12.
반응형

Intro

유료 컨퍼런스로 바뀐 Pycon! (1일 8만 원 💰)

회사에서 감사하게도 지원을 해주셔서 Day1(2023.08.12)에 참석할 수 있었습니다. 🙇🏻‍♂️

힙한 명찰과 가방, 티셔츠를 주는데 개인적으로 전부 마음에 들었습니다.

멋있는 명찰

Pycon은 삼성 코엑스 그랜드볼룸 & 아셈볼룸(북문 쪽)에서 진행되었는데, 강연장도 넓고 의자도 편해서 강연을 듣기 편했던 것 같습니다.

예전 Pycon 2019 때도 같은 장소에서 진행해서 친숙했던 것 같아요.

큰 강의장 - 의자도 편하고 너무 시원하다 :)

생각보다 일찍 도착해서 대기 없이 부스를 돌아볼 수 있었던 점이 좋았습니다.

부스별 서비스나 회사 소개를 들어보기도 하고 뽑기나 돌림판, 설문조사로 선물(티셔츠, 양말, 스티커 등)을 받기도 했습니다.

힙한 파이콘 백, 현대자동차에서 받은 자동차 🚙

 

Lecture

파이썬 사용자와 만난 RustPython

  • Rustpython
    • 컴파일러, 가상머신 → Rust
    • 파이썬 라이브러리 제외하고 모두 Rust로 개발
    • 단점: 느린 개발 (할 일이 많음)
    • 장점: 하고 싶은건 마음껏 가능
  • Ruff
    • https://github.com/astral-sh/ruff
    • Flake8보다 40배 빠른 python 린터
    • 곧 표준에 가까운 도구가 될 전망
    • Rustpython의 parser를 사용
    • Black과 함께 쓰라고 안내하지만 자체 포매터도 개발 중
  • Pylyzer

짠내 나는 데이터 다루기

(부제: 제한된 메모리를 다룰 수 있는 현실적인 데이터)

  • Pandas 메모리 사용량 줄이기 제안
    • 샘플링 (row, col 수 줄이기)
    • 청크와 반복문
    • 데이터 타입 변경
    • parquet 형식을 사용 → 데이터 압축
    • 병렬처리
    • 데이터 베이스 활용
    • 분산 처리 프레임워크 dask, vaex, pyspark
  • 데이터 샘플링
    • 메모리 제약을 피하고 분석 가능
    • 도메인 정보에 따라 샘플링 기준을 정함 (ex. 특정 상품군, 특정 기간, 고객군, 연령대 등)
    • 필요한 데이터만 subset으로 가공
    • pandas sample 활용
  • Chunked processing
    • 데이터를 작은 chunk 단위로 나누어 처리하는 방법
    • pandas read_csv 메서드에서 chunksize 매개변수 활용
  • 데이터 타입 변경
    • 다운캐스트: 작은 데이터 타입으로 변환
    • pandas to_numeric메서드 downcast 파라미터
  • Parquet
    • Column 지향 데이터 파일 형식
      • 열 기반 압축 → 행 기반(csv) 대비 압축의 효율이 좋음 (같은 데이터 type끼리 압축하기 때문)
    • 통계 정보 관련, 메타 데이터 제공
  • Dask, Vaex
    • Dask, Vaex를 쓰지 않더라도 pandas만으로도 충분히 로컬에서 가능하도록 할 수 있다.
    • Dask, Vaex → pandas와 유사한 api + 병렬처리 지원

Async state machine

  • 배경: Task 하위, 여러 subtask → 어떤 task는 작업시간이 오래 걸릴 수 있음
    • API server: task 상태를 DB에서 관리 (여러 개의 status로 정의 가능)
      • task lifecycle
        • task, subtask도 비슷한 상태 관리 로직이 필요
    • Task runner: subtask 실행
    • asyncio: python 비동기처리 모듈
    • 어디서 문제가 발생할지 모름 → 문제마다 예외처리 코드가 필요함
  • 문제: 상태 관리의 어려움 (유지보수)
    • 중구난방 표준 & 비동기 예외처리 코드
      • ex. 어떤 부분에서는 같은 예외처리라도 로깅만 하고, 어떤 부분에서는 중요하게 처리한다는 식
    • 다른 컴포넌트와의 강한 커플링
    • Task, subtask의 상태에 따라 달라지는 로직
  • 해결 방안: State machine
    • 아이디어
      • state, event, transition에 새로운 것을 추가해 보면 어떨까?
      • ⇒ retry 정책
        • state함수와 transition에서의 정책
        • CAP 이론, Consistency, Availability …
      • ⇒ reconciliation loop
        • RPC core에 대한 의존성 사라짐
        • 컴포넌트 간 커플링 제거 가능
        • single source가 병목이 될 수 있는 단점 존재
    • 구현
      • state, transition, asyncstatemachine을 class로 개발

로컬 환경에서 사이즈가 큰 데이터를 처리/분석하기 위한 전략

  • Pandas의 제약사항
    • 메모리 많이 사용
    • 퍼포먼스, 확장성 떨어짐
    • thread가 안전하기 않게 동작
  • 대안
    • ram을 더 산다
    • ray, dask, modin 사용
    • numba, cuDF 사용
  • Pandas 2.0
    • 변화 Point
      • 퍼포먼스, 메모리 효율성 향상
      • time-series 데이터 지원 향상
      • nullable 데이터 타입 지원 (ref. upcasting issue)
      • CoW improvement
        • CoW: copy & write (ex. snapshot)
        • 변화가 있을 때만 copy를 만들어서 리소스를 생성 (리소스 차원에서 효율적으로 관리 가능)
      • Pyarrow functionality
        • numpy 보다 pyarrow를 썼을 때 속도가 빨랐다. (특히 string type)
    • 버전별 비교
      • pandas 0.24.2(pycon 2019 발표 당시 사용 버전), pandas 2.0.3, pandas 2.0.3(pyarrow)
      • pd.read_csv → pandas 2.0.3(pyarrow)가 10배 빨랐음 ⇒ engine=’pyarrow’ 쓰자
      • memory usage → pandas 2.0.3(pyarrow)가 pyarrow 기반 dtype으로 인해 작았음
      • write file: csv << pickle < feather << parquet
      • disk size of saved file: pickle < csv << feather << parquet
      • time to read file: csv <<< pickle < feather, parquet
  • 속도 향상 방법
    • iteration VS vectorization
      • .iterrows(), .apply() → pandas 0.24.2 <<< pandas 2.0.3
      • pd.Series, np.array → pandas 0.24.2 < pandas 2.0.3
      • pa.array → pandas 2.0.3만 가능
        • pa.array는 iterration 대비 속도가 수십 배 빠름
    • 같은 결과, 효율적인 연산 비교
      • sorting → head, nlargest: pandas 2 버전의 성능, 메모리 사용이 적었음
    • 185M row에서 sampling 하는 시간 비교
      • .apply() << list comprehension < pd.DataFrame.isin < pd.DataFrame.query, np.isin
        • .apply()는 pandas 2 버전에서 성능이 list comprehension과 비슷해짐
      • list comprehension → pa.compute.is_in ⇒ 836배 빨라짐
  • Method Chaining
    • 과거에는 디버깅이 어려운 이유로 기피했음 → 현재는 몇 번째 Line에서 오류가 났는지 확인 가능
    • 메모리 사용량, 시간 측면에서 method chaining을 사용하는 것이 분리하는 것보다 성능이 좋았음
df = ( 
	pd
     .read_csv(~~~, engine='pyarrow')
     .groupby('')
     .~~~ 
)
  • Hugging Face datasets
    • apache arrow format

반복적인 일이 싫은 선생님의 Python을 활용한 학교에서의 업무 자동화 사례

  • 중학교 수학교사님의 이야기 (수학과 전공, 수학 교육학 석사)
  • Python을 배운 계기: 학생부 담당 업무, 온라인 출결 체크로 인한 분노 (80%)
  • 문제 정의
    • 학생부에 독서활동상황을 자동화하고 싶다.
    • 한 번의 클릭만으로 모든 반 학생들의 과제별 미제출자만 나오게 할 수 없을까?
    • 적당히 randomness를 주면서 학생들의 특성을 고려한 조편성 방법은 없을까?
  • 학생부에 독서활동상황을 자동화하고 싶다.
    • 배경
      • 1000명의 학생부 독서활동상황에서 중복을 제거하는 작업을 수작업으로 진행했음
      • 수많은 종이 낭비와 야근..
    • 방법
      • 결측치 처리
      • 오타 처리 → Kiwi NLP library 활용해서 유사도 계산
        • list 개수(비교 도서 + 입력 값) / 집합 개수(비교 도서 + 입력 값) → 유사도 (1.6 이상만 확인)
    • 결과: 수많은 학생부 종이를 아낄 수 있었고, 작업 시간을 많이 아낄 수 있었음
  • 한 번의 클릭만으로 모든 반 학생들의 과제별 미제출자만 나오게 할 수 없을까?
    • 배경
      • 코로나 19로 인한 온라인 수업
        • 영상 업로드 > 과제 제출 > 출석처리
      • 5개의 반에 대해 모두 관리해야했음
    • 방법: 웹 크롤링 활용 (selenium)
    • 결과: 코드 실행 시, 2분 만에 미제출자만 추출 가능
  • 적당히 randomness를 주면서 학생들의 특성을 고려한 조편성 방법은 없을까?
    • 배경: 그룹별 특성을 골고루 나누고 싶다.
    • 방법:
      • one-hot encoding 활용
      • 그룹별 표준편차가 0.17 이내가 될 때까지 반복
    • 결과: 다양성을 고려한 조편성
  • Steamlit 활용
    • 배경: 동료 선생님에게는 어떻게 코드를 줄 수 있을까?
    • streamlit: 기초 파이썬만으로 웹앱을 구현할 수 있는 라이브러리
      • markdonw과 형식이 비슷함
      • input, 파일 업로드, 시각화 기능
    • 학교에서 RPA를 위한 도구로 파이썬을 활용했다!

Pandas와 Pyspark로 데이터워크로드 확장하기

  • Intro
    • pandas는 많이 사용하지만 분산처리가 안됨
    • 분산처리는 어떻게?
      • 더 큰 컴퓨터 쓰기
      • 데이터 다운샘플링
      • 분산처리 프레임워크로 옮기기
    • Spark가 유명하고 많이 쓰이네? → 다시 배워야 하나..?
      • Spark
        • 불변성
        • 분산 처리
        • 인덱스 개념이 없음
        • Lazy execution
      • Pandas
        • 가변성
        • 로컬
        • 인덱스 존재
        • Eager execution
  • Pandas API on Spark
    • Koalas → Pyspark로 머지 ⇒ pandas와 spark를 하나로 만듦
    • 어떻게 동작할까?: internal frame 개념 도입! → pandas의 가변적인 특징의 흉내를 내고 있는 것
    • 성능
      • 단일 노드: pandas보다 빠른 성능 (pandas는 single core, spark는 다수의 core 사용)
      • 다중 노드: 노드가 많을 수록 더 빨라짐
      • API 커버리지: 80% 이상
        • 100%는 불가능 → ex. 메모리 정보 가져오기의 경우, spark는 lazy execution이라 알 수가 없음
    • 인덱스 설정
      • sequence (pandas range index와 유사) → 큰 데이터에서는 지양
      • distributed-sequence (default, pandas range index와 유사) → 분산처리에 적합
      • distributed → unique index이지만, 1씩 증가하지 않음 (shuffle이 필요 없음) → 가장 높은 성능
    • 그럼 뭐를 배워야할까요?
      • pandas 알고, 분산처리 하고 싶다? → pyspark.pandas
      • pyspark 배울 의지가 있다? → pyspark
  • Pandas로 분산 UDF 작성하기
    • pandas UDF → column(series)를 input, column(series)를 output
      • 원하는대로 타입 힌트를 준다
    • pandas function API → Table을 input, Table을 output
      • 선택적으로 원하는 입력과 출력을 타입핑
      • pyspark는 어떤 api를 호출하느냐에 따라 어떻게 실행시킬지 정함
    • Best practice
      • ML - 그룹핑된 데이터 학습: applyInPandas로 분산처리 가능
      • OOM(Out-of-memory): Salt 활용
    • 디버깅
      • 로컬 → 단일 노드 동작 확인 후, Spark로 돌리기
      • iterator 모델을 쓴다면 (ex. mapInPandas) → python closures를 사용
      • remote debugging, memory profiler, python profilers
    • 성능
      • For 루프를 많이 안쓰도록!
      • 데이터가 파티셔닝 되어있는지 확인
  • Spark Connect
    • Spark의 한계점
      • 응용 프로그램(ex. jupyter , pycharm 등)에 커버를 못하고 있음
      • 언어(R, python, Go 등), edge device에 적용 힘듦 (메모리 이슈 등)
    • Spark Connect API는 프로토콜을 만드는 컨셉 (API Layer 개념)
      • line by line으로 어떻게 실행되고 있는지 알 수 있음
        • 이전에는 코드 전체를 string으로 던져서 실행 후, 결과를 return하는 형태였음
        • traceback될 때마다, 같이 저장한 후 일일히 보내는 방식으로 테스트 중

 

Wrap-up

Pycon 2019 이후 오랜만에 참석해서 반가웠고, 파이썬 관련 다양한 주제를 배울 수 있어서 좋았습니다.

Ruff, Pylyzer, asyncio 등 처음 알게 된 내용이 많았고, 기회가 된다면 써봐야겠다는 생각을 했습니다.

 

가장 인상이 깊었던 강연은 수학교사님이 효율성을 위해 파이썬을 배우고 업무 자동화를 이뤄낸 사례였습니다.

강연자(황수빈님) 분이 코딩하는 교사 쪼랩 커뮤니티를 운영하면서 배우고 있는 내용을 소개하시는데, 데이터 분석, 개발, CS50까지 스터디를 하시는 것을 보고 너무 놀랐습니다. (강사님이 구현하신 Streamlit 기반 RPA)

 

2023 Pycon에서 도전을 받고 새롭게 알게 된 것이 많아서 좋았습니다.

앞으로 배운 내용을 어떻게 적용할지 고민해봐야겠습니다.

반응형

'Log' 카테고리의 다른 글

2023년 회고  (1) 2024.01.01
글또 8기 회고  (1) 2023.07.29
글또 8기 지원글  (1) 2023.07.29
데이터가 이끄는 성장, 1인 데이터 분석가의 이야기  (0) 2023.04.22

댓글