เพิ่ม Port ให้กับ Container ที่ลืม map ไว้ตอนสร้าง

เรื่องของเรื่องลองพวก LLM อยู่พวกเลยเอา ubuntu container ทำงานทุกอย่างเลย แต่ทว่าลืมไป แล้วถ้าจะลองใช้จากข้างนอกต้องทำยังไง ? เพราะตอนสร้าง Container ไม่ได้กำหนด Port ไว้

วิธีการที่เป็นไปได้ ?

  • Cloudflare tunnel / ngrok
  • Container Network เพิ่ม พวก Reverse Proxy เข้าไปครับ
  • Container ลอง Commit State ล่าสุดของมัน แล้ว Run ใหม่อีกตัว แต่ตัวที่ผมเล่นอยู มันสูบ Disk เหลือเกินครับ
AI นอกจาก GPU และเอา Disk นี้แหละที่โคตรสูบบบ

สำหรับ Blog นี้จะเน้นไปท่า Container Network เพิ่ม พวก Reverse Proxy เข้าไปครับ โดยภาพที่ผมทำจะตามรูปเลยครับ โดยภาพรวมจะเป็นแบบนี้

หลังจากเห็นภาพรวมแล้วมาลองกันครับ

  • สร้าง docker network ก่อน
docker network create llm_network
  • จากนั้น เอา network ต่อเข้าไปใน container ที่ run อยู่
docker network connect llm_network ubuntu2204-llm
  • run ตัว Reverse Proxy อันนี้ผมใช้ตัว nginx โดยอยู่ใน network เดียวกัน และกำหนดให้ port ให้เรียบร้อย
docker run -d --name nginx --network llm_network -p 9000:9000 nginx
  • จากนั้นมากำหนด Config เอาง่ายๆของผม ถ้ามายิงเข้า nginx ที่ port 9000 ให้ส่ง request ต่อไปให้อีก container ที่ port 10080 ครับ
server
{
    listen 9000;

    location / {
        proxy_pass http://ubuntu2204-llm:10080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
  • และ Copy Config ใส่เข้าไปครับ
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
  • restart nginx
docker restart nginx
  • ตรวจสอบว่าอยู่วงเดียวกันแล้ว
docker network inspect llm_network
  • Test ลองยิงเข้า nginx
adminping@adminpinglegion:/mnt/c/Users/Chatr$ curl -X GET http://localhost:9000/v1/models   -H 'accept: application/json' | jq '.'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   108  100   108    0     0  25168      0 --:--:-- --:--:-- --:--:-- 27000
{
  "object": "list",
  "data": [
    {
      "id": "default",
      "created": 1720222826,
      "object": "model",
      "owned_by": "Not specified"
    }
  ]
}
  • ลองอื่นๆบ้าง
curl -X POST http://localhost:9000/v1/chat/completions   -H 'accept: application/json'   -H 'Content-Type: application/json'   -d '{"messages":[{"role":"system", "
content": "You are a high school science teacher. Explain concepts in very simple English."}, {"role":"user", "content": "What is Mercury?"}]}' | jq '.'

ถ้าลองยิงจากข้างนอกแล้วติดปัญหา ลอง docker exec เข้าไปใน nginx แล้วลอง curl ครับ

PS C:\Users\Chatr> docker exec -it ubuntu2204-llm /bin/bash
root@04164155bc14:/# curl -X GET http://localhost:8080/v1/models \
  -H 'accept: application/json'
{"object":"list","data":[{"id":"default","created":1720221065,"object":"model","owned_by":"Not specified"}]}root@04164155bc14:/#
root@04164155bc14:/#

สำหรับ Blog นี้ของผมจะเป็นการแชร์วิธีการนึง พอดีตอนนั้นอยากลอง LLM ให้มันจบๆ แล้วลบทิ้ง + ตอนนั้นไม่มีพื้นที่ในคอมด้วยครับ แต่ถ้าจะให้ดี docker cp ย้าย Data ออกมา แล้วสร้าง Container ใหม่ก็เป็นอีกทางเลือกนึงครับผม จริงๆตอนออกแบบควรกำหนด Port / Mount อะไรให้เรียบร้อยด้วยครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.