굳이 Copilot을 주피터에서 사용해야 하나요?
- 최근 Github Copilot Chat이 베타 버전으로 출시되었는데, 잠시 사용해보니 나쁘지 않았다.
- 그런데 현재는 베타 버전이어서 VSCode에서만 사용이 가능하다.
- 현재는 개발 부서에서 일을 하고 있긴 하지만, 분석을 할 일이 종종 있다. 그런데 다루는 데이터 크기가 워낙 크다보니 로컬에서는 어렵고, 회사 내의 Spark 클러스터 자원을 써야만 분석이 가능하다.
- Spark 클러스터에 붙으려면 사내 k8s 내에서만 접근이 가능하기 때문에 팀 내 주피터허브를 만들어두고 이걸로 주로 분석한다.
- 분석을 할 때 코파일럿 채팅은 커녕 코파일럿도 없이 쌩으로 jupyterlab에서 분석을 하는데 코파일럿이 있다 없으니 참 불편하다.
- 그래서 Jupyterhub에서 코파일럿과 코파일럿 채팅을 사용해보려고 여러 삽질을 해봤고, 결국 성공했다.
1. Jupyterhub 설치
이 부분은 자세히 다루진 않는다.
알아서 환경에 따라 잘 설치하면 되는데, 나 같은 경우는 Helm을 이용해서 설치했다.
https://z2jh.jupyter.org/en/stable/를 참고하면 되고, 버전은 크게 상관 없으니 k8s 버전에 따라 최신 버전을 쓰든 조금 오래된 버전을 쓰든 하자.
2. Jupyterlab 이미지 만들기
jupyterhub의 개념에서 각각의 유저는 자기만의 jupyter 파드(Pod)를 가진다.
이걸 single-user라고 부르는데, 어떤 이미지로 jupyter 파드를 띄울 것인지는 본인이 지정할 수 있다.
values.yaml에서 아래와 같은 설정인데, 코파일럿 설정을 위해서는 이 부분을 건드려야 한다.
singleuser:
image:
name: myjupyter-image
tag: version
그러면 myjupyter-image를 Dockerfile을 통해 만들어보자.
참고로 아래 코드는 일부 발췌한거기 때문에 안 돌아갈 수 있다.
특히 Base 이미지를 사내 환경이 설정된 이미지를 사용했기 때문에 all-spark-notebook으로 동작하는지 알 수 없다.
2.1. code-server 설치
code-server는 vscode의 오픈소스 버전이라고 생각하면 된다.
coder라는 곳에서 오픈소스 + 상용 솔루션을 같이 만드는 것 같은데, 베이스가 되는 code-server도 같이 제공해준다.
참고로 coder에서 제공하는 별개의 솔루션도 있는데 OSS 버전도 제공하니 그걸 쓰는 것도 좋을 듯하다.
# 이 부분은 본인이 필요한 베이스 이미지를 사용하면 된다.
FROM jupyter/all-spark-notebook
# Install VS Code server and extensions
# code-server를 다른 곳에 복사해뒀다가 entrypoint에서 다시 가져와야함..
## Install code-server
ARG CODE_SERVER_VERSION=4.19.1
RUN mkdir /opt/code-server
COPY jupyter_resources/GitHub.copilot-1.143.601.vsix jupyter_resources/GitHub.copilot-chat-0.12.2023121501.vsix /opt/code-server/
# copilot과 copilot-chat을 미리 설치
# copilot-chat이 현재(2023-12-19) 최신 버전의 code-server와 호환이 안 되서, vsix 압축 해제 후 호환성 변경 후 다시 압축하는 형태로 설치
# https://github.com/coder/code-server/discussions/5063#discussioncomment-7847930
RUN cd /opt/code-server \
&& curl -sL https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION}-linux-$(dpkg --print-architecture).tar.gz | tar zxf - --no-same-owner --strip-components=1 \
&& curl -sL https://upload.wikimedia.org/wikipedia/commons/9/9a/Visual_Studio_Code_1.35_icon.svg -o vscode.svg \
## Install code-server extensions
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension christian-kohler.path-intellisense \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension redhat.vscode-yaml \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension grapecity.gc-excelviewer \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension oderwat.indent-rainbow \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mechatroner.rainbow-csv \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension vscode-icons-team.vscode-icons \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-toolsai.jupyter \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension /opt/code-server/GitHub.copilot-1.143.601.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension /opt/code-server/GitHub.copilot-chat-0.12.2023121501.vsix \
## 아래 명령어를 추가해야 code-server terminal에서 pyenv를 정상적으로 사용 가능
&& echo 'eval "$(pyenv init -)"' >> ${HOME}/.bashrc
어쨌든, 위 코드는 code-server를 다운로드 받아 설치하는 과정이다.
CODE_SERVER 버전을 명시하고, 코파일럿과 코파일럿 채팅 익스텐션 파일을 미리 받아두고 옮겨서 설치한다.
이 두 가지만 굳이 이렇게 설치하는 이유는, code-server에 공식적으로 제공하는 익스텐션이 아니기 때문에 코파일럿 채팅 익스텐션의 버전 호환성이 안 맞기 때문이다.
그래서 VSCODE Marketplace에서 미리 다운로드 받은 뒤 unzip으로 압축을 해제하고 package.json 파일의 vscode 버전이 1.86 이상으로 되어있는데 1.84 이상으로 수정한다. (Code Server 4.19.1이 vscode 1.84.1 버전을 내부적으로 사용하고 있다)
그리고 다시 zip으로 압축하고 이름만 vsix로 수정하면 된다.
이 과정이 귀찮으면 미리 수정해둔 아래 파일을 다운로드 받아도 된다.
여튼 익스텐션은 필수적인 것들을 미리 설치해두는데, 당연히 필요에 따라 제외하거나 추가해도 무방하다.
여기까지 하면 이미지에 code-server 자체는 설치를 했는데, jupyterlab이 띄워질 때 같이 실행되도록 설정도 해야한다.
2.2. jupyterlab 내에 code-server 실행 경로 아이콘 만들기
jupyterlab의 메인 페이지에 code-server 실행 아이콘을 만들어두고, 클릭하면 vscode로 진입할 수 있도록 만들려고 한다.

이러기 위해서는 jupyter_server_config.py를 수정해야 한다.
# jupyter_server_config.py
import os
import shutil
# Default 커널 제거
c.KernelSpecManager.ensure_native_kernel = False
c.ContentsManager.allow_hidden=True
def _codeserver_command(port):
full_path = shutil.which("code-server")
if not full_path:
raise FileNotFoundError("Can not find code-server in $PATH")
work_dir = os.getenv("CODE_WORKDIR", None)
if work_dir is None:
work_dir = os.getenv("HOME", ".")
elif os.path.isdir(work_dir) is False:
os.mkdir(work_dir)
data_dir = os.getenv("CODE_USER_DATA_DIR", "")
if data_dir != "":
data_dir = "--user-data-dir=" + str(data_dir)
extensions_dir = os.getenv("CODE_EXTENSIONS_DIR", "")
if extensions_dir != "":
extensions_dir = "--extensions-dir=" + str(extensions_dir)
return [
full_path,
"--bind-addr=0.0.0.0:" + str(port),
"--auth",
"none",
data_dir,
extensions_dir,
work_dir,
]
c.ServerProxy.servers = {
"code-server": {
"command": _codeserver_command,
"timeout": 20,
"launcher_entry": {
"title": "VSCode Server",
"icon_path": "/opt/code-server/vscode.svg"
},
"new_browser_tab": True
}
}
코드는 code_server를 환경변수들을 조합해서 실행 명령어를 만들고, c.ServerProxy.servers를 이용해서 code-server 아이콘을 등록하는 과정이다.
이 파일을 Dockerfile에서 jupyter가 인식할 수 있도록 복사해줘야 한다.
# Jupyter에 code-server 실행 아이콘 추가
# jupyter_server_config를 미리 정의해두고 jupyter에서 설정한다.
ENV NOTEBOOK_HOME=/home/user
COPY jupyter_resources/jupyter_server_config.py /opt/home/jupyter_resources/jupyter_server_config.py
RUN mkdir -p $NOTEBOOK_HOME \
&& sudo chown -R app:app $NOTEBOOK_HOME \
&& echo "c.ServerApp.root_dir = '$NOTEBOOK_HOME'" >> $HOME/.jupyter/jupyter_server_config.py \
&& cat /opt/home/jupyter_resources/jupyter_server_config.py >> $HOME/.jupyter/jupyter_server_config.py
이렇게 하면 모든 설정이 완료된다.
2.3. Dockerfile 최종
위의 조각난 Dockerfile을 합쳐보면 이런 형태이다.
# 이 부분은 본인이 필요한 베이스 이미지를 사용하면 된다.
FROM jupyter/all-spark-notebook
# Install VS Code server and extensions
# code-server를 다른 곳에 복사해뒀다가 entrypoint에서 다시 가져와야함..
## Install code-server
ARG CODE_SERVER_VERSION=4.19.1
RUN mkdir /opt/code-server
COPY jupyter_resources/GitHub.copilot-1.143.601.vsix jupyter_resources/GitHub.copilot-chat-0.12.2023121501.vsix /opt/code-server/
# copilot과 copilot-chat을 미리 설치
# copilot-chat이 현재(2023-12-19) 최신 버전의 code-server와 호환이 안 되서, vsix 압축 해제 후 호환성 변경 후 다시 압축하는 형태로 설치
# https://github.com/coder/code-server/discussions/5063#discussioncomment-7847930
RUN cd /opt/code-server \
&& curl -sL https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION}-linux-$(dpkg --print-architecture).tar.gz | tar zxf - --no-same-owner --strip-components=1 \
&& curl -sL https://upload.wikimedia.org/wikipedia/commons/9/9a/Visual_Studio_Code_1.35_icon.svg -o vscode.svg \
## Install code-server extensions
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-python.python \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension christian-kohler.path-intellisense \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension redhat.vscode-yaml \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension grapecity.gc-excelviewer \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension oderwat.indent-rainbow \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension mechatroner.rainbow-csv \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension vscode-icons-team.vscode-icons \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension ms-toolsai.jupyter \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension /opt/code-server/GitHub.copilot-1.143.601.vsix \
&& code-server --extensions-dir ${CODE_BUILTIN_EXTENSIONS_DIR} --install-extension /opt/code-server/GitHub.copilot-chat-0.12.2023121501.vsix \
## 아래 명령어를 추가해야 code-server terminal에서 pyenv를 정상적으로 사용 가능
&& echo 'eval "$(pyenv init -)"' >> ${HOME}/.bashrc
# 한글폰트
ENV MATPLOTLIBRC=/opt/home/matplotlibrc
RUN wget https://intwg.kakaocdn.net/localsearch_common/for_docker_build/NanumFont_TTF_ALL.zip && \
sudo unzip NanumFont_TTF_ALL.zip -d /usr/share/fonts/NanumFont && \
rm NanumFont_TTF_ALL.zip
COPY matplotlibrc $MATPLOTLIBRC
# Jupyter에 code-server 실행 아이콘 추가
# jupyter_server_config를 미리 정의해두고 jupyter에서 설정한다.
ENV NOTEBOOK_HOME=/home/user
COPY jupyter_resources/jupyter_server_config.py /opt/home/jupyter_resources/jupyter_server_config.py
RUN mkdir -p $NOTEBOOK_HOME \
&& sudo chown -R app:app $NOTEBOOK_HOME \
&& echo "c.ServerApp.root_dir = '$NOTEBOOK_HOME'" >> $HOME/.jupyter/jupyter_server_config.py \
&& cat /opt/home/jupyter_resources/jupyter_server_config.py >> $HOME/.jupyter/jupyter_server_config.py
ENTRYPOINT ["/opt/home/entrypoint.sh"]
EXPOSE 8888
WORKDIR $HOME
이걸로 Docker 이미지를 만들고, helm의 single-user 이미지에 넣어주면 이제 코파일럿을 사용할 수 있다. (dockerhub든 별개의 이미지 레지스트리이든 이미지를 올리긴 해야한다)
3. 결과물
위에서의 스크린샷처럼 code-server 아이콘을 클릭하면 웹 형태의 VSCode가 실행된다.

github 로그인을 해주자.
참고로 github 로그인이 안 된다면, 프록시 이슈일 수 있다.
회사라면 proxy 환경변수 설정을 해주거나 (http_proxy, https_proxy, no_proxy 등) 사내 보안팀에 https://api.githubcopilot.com/ 를 proxy 오픈해달라고 요청해야 할 수 있다.

코파일럿 Tip
소개하는 김에 코파일럿을 사용하면서 제일 중요했던 팁 두 가지만 공유 해보자면..
1. 주석 달아두기
코드 -> 주석의 순서가 아니라, 주석 -> 코드 순서로 작업을 하는 것이 좋다.
주석을 얼마나 잘 달아두느냐에 따라 코파일럿이 제안해주는 코드의 품질이 달라진다.
코드를 잘 제안해주지 못 했다면 무시하기보다, 주석을 더 상세히 적어보는 것도 좋다.
2. 데이터 붙여넣기
코드를 구현하기 전에 관련 데이터가 있다면 무조건 데이터를 주석으로 붙여놓자.
데이터를 주석으로 달아놓고 코드를 짜기 시작하면, 그걸 고려해서 코파일럿이 제안해준다.

'스터디 > DevOps' 카테고리의 다른 글
[Kubernetes] #4 ReplicaSet (0) | 2022.10.29 |
---|---|
[Kubernetes] #3 Pod (2) | 2022.10.08 |
[Kubernetes] #2 Kubernetes Architecture (0) | 2022.09.29 |
[Kubernetes] #1 Kubernetes(쿠버네티스) 개요 및 가상화 기술 (0) | 2022.09.29 |
[Kubernetes] 쿠버네티스(Kubernetes)에서 주피터허브(JupyterHub)에 Random Port 설정하기 (0) | 2022.04.17 |