Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CyberAgent AI事業本部2024年度MLOps研修Container編 / Container for MLOps

sZma5a
May 30, 2024
9.4k

CyberAgent AI事業本部2024年度MLOps研修Container編 / Container for MLOps

同年度のMLOps研修資料はこちらです。
(1/4) CyberAgent AI事業本部2024年度MLOps研修Container編: https://speakerdeck.com/szma5a/container-for-mlops
(2/4) CyberAgent AI事業本部2024年度MLOps研修基礎編: https://speakerdeck.com/nsakki55/mlops-basic
(3/4) CyberAgent AI事業本部2024年度MLOps研修応用編: https://speakerdeck.com/tyaba/mlops-handson
(4/4) CyberAgent AI事業本部2024年度MLOps研修実践編: https://speakerdeck.com/hosimesi11/mlops-practice

sZma5a

May 30, 2024
Tweet

Transcript

  1. ©2024 CyberAgent Inc. Distribution prohibited Hypervisor: ハードウェアが抽象化されているため、OSレベ ルで分離することができる。そのため、自由に OS(Linux, Windows,

    macOS)を選択するこ とができるが、起動までに時間がかかる。 ex) VirtualBox, KVM HypervisorとContainerの違い https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
  2. ©2024 CyberAgent Inc. Distribution prohibited ContainerはLinuxのカーネル機能であるNamespaceとcgroupを用いて実行環 境を分離している。 • Namespace プロセスやユーザグループを論理的に分割するために用いる

    ex) マウント名前空間, PID名前空間, ネットワーク名前空間, IPC名前空間... • cgroup プロセスに対しリソースの制限をかけるための仕組み Container Structure
  3. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 Dockerfileとはイメージを作成するため の命令が書かれたドキュメントファイル のことである。 Dockerfileでは既存のイメージをベース

    トしたカスタムイメージを作成すること ができる。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  4. ©2024 CyberAgent Inc. Distribution prohibited $ docker history golang:latest IMAGE

    CREATED CREATED BY SIZE COMMENT 295f95becd4e 3 weeks ago WORKDIR /go 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c mkdir -p "$GOPATH/src" "$GOPA… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago COPY /usr/local/go/ /usr/local/go/ # buildkit 220MB buildkit.dockerfile.v0 <missing> 3 weeks ago ENV PATH=/go/bin:/usr/local/go/bin:/usr/loca… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOPATH=/go 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOTOOLCHAIN=local 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOLANG_VERSION=1.22.2 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; apt-get update; a… 240MB buildkit.dockerfile.v0 <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 183MB <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 48.5MB <missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 days ago /bin/sh -c #(nop) ADD file:07ae70ad05f39a240… 139MB コンテナイメージはレイヤー構造で管理されており、docker historyでイメー ジの構造を見ることができる。 イメージの作成
  5. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 各レイヤはDockerfileに書かれた命令 (FROM, RUNなど)と対応している。 また、レイヤごとにキャッシュが作成さ

    れており、ビルドの効率化やレジストリ へのアップロードなどで使われる。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  6. ©2024 CyberAgent Inc. Distribution prohibited ベースイメージの指定 FROM: ベースとなるイメージを指定している。 golang:<version> Debianベースのイメージ

    golang:<version>-alpine 軽量なAlpineを使用したイメージ golang:<version>-windowsservercore Windows coreをベースとしたイメージ FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  7. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 WORKDIR イメージ内での作業ディレクトリを指定 している。 WORKDIRが指定されている場合、後続

    の命令は全て該当のディレクトリで実行 される。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  8. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 FROM golang:1.22 WORKDIR /app

    COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"] COPY ファイルをイメージ内にコピーするため の命令。 オプションを使うことによって、様々な 方法でファイルを持って来れる。
  9. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 --fromで指定することで、他のビルド ステージやイメージからファイルをコ ピーすることができる。 FROM

    golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"] FROM golang:1.19 as bulder … RUN go build -o /docker-gs-ping —----------------------------------------- FROM golang:1.19 COPY --from=builder /docker-gs-ping / CMD ["/docker-gs-ping"] 1つのDockerfile
  10. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 他にも... --exclude: 除外指定 (labs)

    --chown --chmod: 権限周りを指定 etc... 様々なオプションが存在する。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  11. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 RUN イメージビルド時にコマンドを実行するた めの命令。 ※

    コマンドの文字列からキャッシュを行う FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  12. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 FROM golang:1.22 WORKDIR /app

    COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"] EXPOSE コンテナを実行時にリッスンするポートを 示す命令。 実際にポートが公開されるわけではない が、使用するポートを実行環境に示すため に用いられる。
  13. ©2024 CyberAgent Inc. Distribution prohibited イメージの作成 CMD コンテナが起動時に実行されるコマンド を指定する命令。 似たような命令としてENTRYPOINTも

    あり、docker run時にコマンドを指定 した時の挙動が異なる。 CMDの場合はそのコマンドで上書きさ れるが、ENTRYPOINTの場合はオプ ションとして実行される。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  14. ©2024 CyberAgent Inc. Distribution prohibited イメージのビルド $ docker build .

    -t mlops-handson/mecab:v1 コンテキストの指定. Dockerに見てほしいpath. COPY句でどこを起点にするか. 基本的にDockerfileのある場所でOK イメージ名. お作法的にはowner/image_name イメージタグ. イメージは更新されゆくのでいわゆるversioning イメージのビルド時はdocker buildコマンドを使用する。
  15. ©2024 CyberAgent Inc. Distribution prohibited コンテナの起動 $ docker run -p

    8080:80 mlops-handson/mecab:v1 外部公開するポートを指定することで、ホストマシンからコンテナ内のアプリ ケーションにアクセスすることができる ビルドしたイメージを指定 必要に応じて外部公開するポートを指定しdocker runでコンテナを実行する。
  16. ©2024 CyberAgent Inc. Distribution prohibited Dockerでは6種類のネットワークドライバが存在 し、それらを元にコンテナ間ネットワークの構築や 外部との接続を行う。 Dockerネットワーク bridge

    (Default) コンテナ間の通信をブリッジすることでお互いに通信することができる host ホストのネットワークに直接参加する overlay 複数のDockerデーモンを接続することができる ipvlan L2またはL3からコンテナネットワークを構築することができる macvlan コンテナにMACアドレスを割り当てることができる none ネットワークを割り当てない(接続しない)
  17. ©2024 CyberAgent Inc. Distribution prohibited $ docker history golang:latest IMAGE

    CREATED CREATED BY SIZE COMMENT 295f95becd4e 3 weeks ago WORKDIR /go 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c mkdir -p "$GOPATH/src" "$GOPA… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago COPY /usr/local/go/ /usr/local/go/ # buildkit 220MB buildkit.dockerfile.v0 <missing> 3 weeks ago ENV PATH=/go/bin:/usr/local/go/bin:/usr/loca… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOPATH=/go 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOTOOLCHAIN=local 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GOLANG_VERSION=1.22.2 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; apt-get update; a… 240MB buildkit.dockerfile.v0 <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 183MB <missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 48.5MB <missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 days ago /bin/sh -c #(nop) ADD file:07ae70ad05f39a240… 139MB docker historyで各レイヤーの内容やサイズを見れるので、適宜確認しながら イメージを最適化していく。 レイヤーごとのサイズ確認方法
  18. ©2024 CyberAgent Inc. Distribution prohibited • マルチステージビルド • ベースイメージの選定 •

    RUN使用時の注意 • 依存関係周りのキャッシュ • COPY使用時の注意 • 静的ファイルの取り扱い 軽量化方法
  19. ©2024 CyberAgent Inc. Distribution prohibited 実行用とビルド用にステージを分けるこ とによって、最終的なイメージを軽量で セキュアなものにする方法。 実行に必要な物のみが含まれたイメージ を作ることができるため、余分なレイ

    ヤーやライブラリを省くことができる。 マルチステージビルド FROM golang:1.22 as builder RUN apt-get install -y hoge… COPY *.go ./ RUN go build -o /binary FROM distroless as runner COPY --from builder /binary /binary RUN go build -o /binary CMD ["/binary"] 1つのDockerfile
  20. ©2024 CyberAgent Inc. Distribution prohibited ベースイメージの選定 ビルドと実行で使用するものは同じでな くても良い。 debian-slim Debianベースのイメージではあるが、必要最低限

    のパッケージしかはいっていない。 alpine Alpine Linuxを用いた軽量のイメージ。 distroless ランタイム用の軽量なイメージであり、シェルがない ため安全に実行することができる。 FROM golang:1.22 WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-gs-ping EXPOSE 8080 CMD ["/docker-gs-ping"]
  21. ©2024 CyberAgent Inc. Distribution prohibited RUN使用時の注意 ファイルの取り扱い パッケージリストの更新と削除が分かれて いるため、レイヤに残ってしまう。 パッケージのキャッシュ

    パッケージのアップデートのみをRUNに置 くと、キャッシュにより更新されない。 →レイヤーはなるべくまとめて減らす FROM ubuntu:latest # パッケージデータがレイヤに保管される RUN apt-get update RUN apt-get install -y nginx RUN rm -rf /var/lib/apt/lists/* … # 修正 RUN apt-get update \ && apt-get install nginx \ && rm -rf /var/lib/apt/lists/*
  22. ©2024 CyberAgent Inc. Distribution prohibited COPY使用時の注意 … # 不要なものもCOPYのレイヤは残る COPY

    . . RUN rm -r ./tmp … RUNと同様にファイル取得と削除のレイ ヤが別れるとサイズを小さくすることが できない。 そのため、COPYでは必要なものだけ持っ てくることや不必要なものを省く。
  23. ©2024 CyberAgent Inc. Distribution prohibited プログラム実行時に使用する静的ファイルのサイズによっては、イメージに含め ずマウントする方が適切な場合がある。 ・ライフサイクル  ファイルの更新と合わせイメージを最新化する必要があるか ・ネットワーク

     イメージのアップデートやデプロイの際のトラフィック量や経路 ・スケール  イメージ起動までの時間はスケール時に許容できるか →学習モデルや学習データはイメージに含めずマウントすることも考える 静的ファイルの取り扱い
  24. ©2024 CyberAgent Inc. Distribution prohibited ホストマシンでContainer Runtimeを実行す る際、rootで実行しない。 Dockerではホストマシンのディレクトリをコ ンテナ内にbindすることができるため、マシ

    ン全体が攻撃される恐れがある。 セキュリティ rootlessでの実行(ホスト) https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/