DockerでPythonの開発環境を作る
突然、チャットbotを作る遊びをしたくなった。
最終的にはドキュメントをベクトルデータベースに突っ込んで、そこの情報を踏まえつつ、ChatGPT様にお話をうかがってありがたいお言葉をいただく、というようなものを作りたいのだけど、そもそもわたしはOpenAI APIというものを触ったことがない。
そこでまずはOpenAI APIを扱えるようにすべく、DockerでPythonを書けるようにするための開発環境を整えることにした。開発環境をローカルではなくDockerで建てる理由はなんかかっこいいからであり、コードをPythonで書く理由はなんとなくみんなが使ってる気がするからである。加えて、最近手に馴染ませようとがんばってきたGolangが正直あんまりしっくりきていないため、何か違う言語に触れたいというのもあった。
前提
- 環境は以下の通り
- MacOS 13.4.1(c)
- MacBook Pro
- M1 Max
- メモリ64GB
- 512GB SSD
- エディタはVSCode
やることの概要
- Docker Desktopをインストールする
- 作業用ディレクトリを用意して、Dockerfileを書く
- requirements.txtを書く
- サンプルコードを書く
- ビルドして、コンテナを立ち上げる
- コードを実行する
- やったね
Docker Desktopをインストールする
こちらからインストールする。これがなくては始まらない。M1やM2などのApple Siliconの端末を利用している場合は、Apple Chip
のリンクからダウンロードする。Intel版でもRozetta2でエミュレートすれば動くだろうが、2023年現在あえてそうする意味はあまりないと思われる。
インストール次第すぐにDockerを立ち上げておくと、あとで怒られなくていいかもしれない。
作業用ディレクトリを用意して、Dockerfileを書く
作業用ディレクトリを適当なところに用意する。今回はPythonというフォルダにtestというサブフォルダを作って、testを作業用ディレクトリとする。
作業用ディレクトリにDockerfileを作る。都度コマンドで諸々指定するのも面倒なので、Dockerfileにはその諸々の指定を書いておく。
# Pythonのイメージ
FROM python:3.9
# 作業ディレクトリを設定する
WORKDIR /test
# 必要なパッケージをインストールする
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# ローカルのソースコードをコピーする
COPY . .
# コンテナ起動時に実行するコマンドを設定する
CMD ["python", "./sample.py"]
FROMで持ってくるイメージはとりあえずPythonが動けばなんでもいい気はするが、色々調べているうちに「alpineというのはやめとけ」という先人達のアドバイスがあったので、公式のイメージを取ってくることにした。なんでもalpineはビルドが遅いんだと。そういうアドバイスは素直に聞く派です。
WORKDIR
はいろいろ設定をいじってみたが、単にPythonのコードを動かすだけならどこを指定してもいいらしい。
今回はopenai
なるライブラリをインストールする必要があり、ビルドの度にインストールするのも面倒なため、requirements.txtを用意する。
requirements.txtを書く
requirements.txtはPythonのプロジェクトで必要となる外部パッケージの一覧を記述したファイルらしい。今回はとりあえずopenai
が必要なことだけが分かっているので、一旦ファイルには以下の通り書いておく。ファイルはもちろん作業用ディレクトリに保存する。
openai
これだけで本当に動くのかよと思ったが、実際ビルドするとインストールされたので大したもんだ(?)と思った。
サンプルコードを書く
ビルドした後にすぐに試せるようサンプルコードを作業用ディレクトリに用意する。今回は以下のようなサンプルコード(sample.pyと名付けた)を書いた。
import openai
openai.api_key = 'XXXXXXXXXXXXXXXXXXXXX'
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role":"user","content":"Please tell me about tokyo city"},
]
)
print(response)
openai.api_keyには、その名の通りOpenAIのAPIキーを設定する(OpenAIのAPIキーの取得方法は省略する。)。
ビルドして、コンテナを立ち上げる
さあ、準備は整った。いよいよイメージをビルドしてコンテナを立ち上げたい。
まずイメージをビルドするには以下のコマンドを実行する。
docker build -t testimage .
testimage
はイメージの名前なので、任意の文字列に変更してOK。ビルド処理がつつがなく終わると、Docker Desktopからもイメージの内容が確認できるようになる。
次に、イメージを使ってコンテナを立ち上げるために以下のコマンドを実行する。
docker run -it --rm testimage /bin/sh
この時/bin/sh
と末尾に追記することで、コンテナが立ち上がり次第、コンテナの中身をCLIで触れるようになる。ここでシェルを指定せずに、Dockerfileで定義された処理を実行するだけの場合もあるらしい。コンテナの運用コストを圧縮するために、コンテナを都度立ち上げて処理を一発かました後すぐに落とすようなユースケースで使う方法だろうか?開発環境においてはシェルを指定しない利用シーンがよくわからない。
無事に立ち上がると、コンテナ側のCLIに入れる。
ここまでで簡単な開発環境の構築は終わり、なのだが。。
Python実行時に謎のエラーが出る
よし!と思って早速sample.pyを実行すると以下のエラーが出た。
#python sample.py
Traceback (most recent call last):
File "/app/sample.py", line 4, in <module>
response = openai.ChatCompletion.create(
File "/usr/local/lib/python3.9/site-packages/openai/api_resources/chat_completion.py", line 25, in create
return super().create(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/openai/api_resources/abstract/engine_api_resource.py", line 153, in create
response, _, api_key = requestor.request(
File "/usr/local/lib/python3.9/site-packages/openai/api_requestor.py", line 298, in request
resp, got_stream = self._interpret_response(result, stream)
File "/usr/local/lib/python3.9/site-packages/openai/api_requestor.py", line 700, in _interpret_response
self._interpret_response_line(
File "/usr/local/lib/python3.9/site-packages/openai/api_requestor.py", line 763, in _interpret_response_line
raise self.handle_error_response(
openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details
れいとりみっとえらー?エンジンはGPT3.5だけど上限あるのか?いや、APIではあるのか?でもよく見るとbilling details
って書いてあるからなんだろう?普通にサブスクは有効だしな...とかいろいろ思いが巡ったが、これはAPIの利用にあたってのクレジットカード登録とその利用上限設定をやってないことにより出たエラーであることがわかった。ここでも先人の知恵に感謝します。
仕事柄、AWS課金地獄みたいな怪談に日々背筋を凍らせているため、やる気あんのかと言われかねないヘッジを設けた。
課金上限を設定した上で再度実行すると、無事まともなレスポンスが得られた。やったね。
# python sample.py
{
"id": "chatcmpl-XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"object": "chat.completion",
"created": 1689316405,
"model": "gpt-3.5-turbo-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Tokyo is the capital and the largest city of Japan. Located on the eastern coast of the island of Honshu, Tokyo is a vibrant, bustling metropolis known for its unique blend of traditional and futuristic culture. Here are some key details about the city:\n\n1. Population: Tokyo is the most populous city in the world, with a population of over 14 million people in the 23 special wards, and over 37 million in the wider Tokyo Metropolitan Area.\n\n2. History: Tokyo has a long and rich history, dating back to the 12th century when it was known as Edo. It became the capital of Japan in 1868, marking the beginning of the Meiji era.\n\n3. Economy: Tokyo is a major economic powerhouse and a global financial center, housing the headquarters of numerous national and international companies. It is known for its strong presence in technology, finance, manufacturing, and media industries.\n\n4. Cultural Hub: Tokyo offers a fascinating blend of modernity and tradition. While its skyline is filled with skyscrapers and high-tech buildings, historic landmarks such as temples, shrines, and traditional neighborhoods like Asakusa and Yanaka can still be found.\n\n5. Food and Cuisine: Tokyo is a food lover's paradise. The city boasts a wide range of culinary delights, from world-renowned sushi and ramen to street food and Michelin-starred restaurants. Tsukiji Fish Market, the largest wholesale fish market in the world, is also a must-visit for seafood enthusiasts.\n\n6. Entertainment and Fashion: The city is a hub for entertainment and fashion, with famous districts like Shibuya, Harajuku, and Akihabara offering trendy shopping, vibrant nightlife, and pop culture experiences, including anime and manga.\n\n7. Transportation: Tokyo has an efficient and extensive public transportation system, including a well-connected network of trains and subway lines. The iconic Shinkansen (bullet train) connects Tokyo with other major cities in Japan.\n\n8. Parks and Gardens: Despite being a densely populated city, Tokyo offers several spacious parks and gardens where people can relax and escape the urban hustle. The most famous ones include Ueno Park, Yoyogi Park, and Shinjuku Gyoen National Garden.\n\n9. Technology and Innovation: Tokyo is at the forefront of technological advancements and innovation. It is known for its cutting-edge electronics, robotics, and advancements in areas like transportation and infrastructure.\n\n10. Events and Festivals: Tokyo hosts a variety of events and festivals throughout the year. Notable ones include Sakura (cherry blossom) season, Sumida River Fireworks Festival, and the Tokyo International Film Festival.\n\nOverall, Tokyo is a vibrant city with a rich cultural heritage, offering a mix of traditional and modern attractions, making it a must-visit destination for travelers."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 15,
"completion_tokens": 567,
"total_tokens": 582
}
}
Discussion