[Cloud Platform] 身為 AI (LLM) Engineer 關於雲平台的挑選 Heroku v.s. Render

image-20240104115649015

前情提要:

有在持續關注我的部落格的朋友,都知道我喜歡透過 Heroku 來快速部署我自己的雲服務 (或是 LINE Bot)。 當初 Heroku 就打著好上手,並且有免費方案的流程來讓許多開發者都有使用到。但是在 2022 十一月之後,就開始收費的 Heroku 也開啟許多人跑走的路途。這邊可以查看以下相關資料:

由於我手上的 Hobby Project 大概有 50~80 個,所以也就選擇先留在 Heroku 看看? (要搬移真的太累) 每個月五美金的費用,也算是中規中矩,畢竟也是某些程度吃到飽(1000 dyno hours) ,也足夠我用。

但是又聽到朋友們的提醒與鞭策,於是來認真看一下跟測試結果。

tl;dr 先講結論

  • Heroku ($5) 雖然沒有免費,但是共用的 Eco Dyno 其實後夠力。 Render ($7) 每一個要單獨收,有點貴。
  • 我會開始放一些到 Render $0 的方案,原因後提。
  • 兩個都部署跟發布,但是我還是會留在 Heroku ($5) (因為它是共用 1000 hours)

價位比較 (based: 2024/01/02)

Render 的價格跟性能: (free/Starter)

根據 Render vs Heroku by Render 有一些比較表:

image-20240104095253552

認真看了一下 Render 的費用

image-20240104095320382

  • 看起來 Free-tier 就有 512MB RAM,很不錯(但是要注意 CPU 0.15)
  • 但是要注意 Free Bandwidth 是 100GB ,這個感覺會踩到。

image-20240104095420088

  • 更別說有免費 90 天的 PostgresSQL 資料庫

image-20240104095506022

  • Redis 有 25MB 也夠用,但是會砍掉。

Heroku 的費用與效能部分

  • 沒有 Free-tier
  • 最低收費 Eco $5

根據 Heroku Dyno Types:

image-20240104095813909

  • 效能其實不比 $7 差太多(當然遠遠多於 Render Free-Tier)

image-20240104095917259

快速測試結果

拿了專案 https://github.com/kkdai/linebot-gemini-prohttps://github.com/kkdai/linebot-gemini-pro 來測試,發現:

  • 回覆速度上 Heroku ($5) 跟 Render ($0) 不會差太多。 (Golang App)
  • 但是上傳照片後,要處理 Render ($0) 就會炸掉。 由於記憶體兩者都是 512MB ,考量可能問題出在 CPU 上面。

交叉測試:

加上我另外一個小專案: https://github.com/kkdai/pdf_online_editor?tab=readme-ov-file

img

測試結果 Render ($0) 一樣會炸掉。

測試檔案 44.8MB PDF

Heroku ($5)

image-20240104121612188

Render ($0)

等太久失敗….

image-20240104121857862

付費後的測試 (\(\))

image-20240104122958983

  • 一樣沒反應……. (!!!)
  • 好吧! 悲劇了~~~ 做 RAG 的時候,需要大量的 CPU 這件事情。 Render ($7) 也不能滿足我的需求。

Render 是每一個專案收費, Heroku 是共用 1000 hours

  • 開了兩個專案,每個預計 $7 。總共預期被收 $12 。這就有點讓我吃驚。

image-20240104123423199image-20240104123424548

結論

雖然 Heroku ($5) 比起 Render ($7) 還要便宜,但是考量以下的部分,可能會開始同步開啟:

  • Render 有免費方案,更適合作為活動推廣之用。
  • Render ($7) 有 DB 可以使用,但是 Heroku ($5) 的資料庫要額外付錢。
  • Render ($7) 提供的管理頁面跟相關功能比較多。

但是… 因為 Heroku($5)(CPU) »» Render ($7) ,加上 Render ($7) 是每個專案都要收費。如果開的一多,可能會完全吃不消。

可能要多多考慮…

請推薦給我好用的雲服務

如果有其他好推薦的,請各位留言給我。我的需求如下:

  • 由於 Hobby Project 眾多 (30 ~ 50) 希望可以共用費用。 (e.g. 1000 hours 共用)
  • 希望有收費上限,不要不小心爆表。
  • CPU 希望可以高一點,畢竟 RAG 跟 LLM 需要 CPU 跟 RAM 都不少。

參考資料:

[Golang][Gemini Pro] 使用 Chat Session 與 LINEBot 快速整合出有記憶的 LINE Bot

image-20240103174806953

前提

前幾篇的文章 [Golang] 透過 Google Gemini Pro 來打造一個基本功能 LLM LINE Bot 曾經提過,如何整合基本的 Gemini Pro Chat 與 Gemini Pro Vision 兩個模型的使用。 本次將快速提一下,打造一個具有記憶體的 LINE Bot 該如何做。

相關開源程式碼:

https://github.com/kkdai/linebot-gemini-pro

系列文章:

  1. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (一): Chat Completion and Image Vision
  2. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (二): 使用 Chat Session 與 LINEBot 快速整合出有記憶的 LINE Bot(本篇)
  3. 使用 Golang 透過 Google Gemini Pro 來打造一個具有LLM 功能 LINE Bot (三): 使用 Gemini-Pro-Vision 來打造名片管理的聊天機器人

什麼叫做有記憶的聊天機器人

原本在 OpenAI Completion API 是採取一問一答的方式,也就是你問一次,他回答。 下一次詢問的時候,就會完全的忘記。這邊提供網頁上的說明程式碼:

from openai import OpenAI
client = OpenAI()

response = client.completions.create(
  model="gpt-3.5-turbo-instruct",
  prompt="Write a tagline for an ice cream shop."
)

在之前,如果需要有記憶的功能,就需要把之前的問與答都附在問句的前面。到了之後, OpenAI 推出了 ChatCompletion 的功能,相關的程式碼如下:

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"},
    {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
    {"role": "user", "content": "Where was it played?"}
  ]
)

這時候,要加入相關的對話就需要更加的精確。但是出來的結果也就會更棒。

Gemini-Pro 套件提供的 ChatSession

大家可以參考一下這篇文章 Google GenerativeAI ChatSession Python Client 裡面提供了 ChatSession 讓大家可以直接開啟一個聊天的 Session 。進而會自動把所有訊息都放入 History (也就是放入聊天記錄中)。

# Python ChatSession demo code
>>> model = genai.GenerativeModel(model="gemini-pro")
>>> chat = model.start_chat()
>>> response = chat.send_message("Hello")
>>> print(response.text)
>>> response = chat.send_message(...)

其實 Golang 也有 (refer code) (GoDoc ChatSession Example)

ctx := context.Background()
	client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()
	model := client.GenerativeModel("gemini-pro")
	cs := model.StartChat()

  // ... send() inline func ...
  
	res := send("Can you name some brands of air fryer?")
	printResponse(res)
	iter := cs.SendMessageStream(ctx, genai.Text("Which one of those do you recommend?"))
	for {
		res, err := iter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		printResponse(res)
	}

	for i, c := range cs.History {
		log.Printf("    %d: %+v", i, c)
	}
	res = send("Why do you like the Philips?")
	if err != nil {
		log.Fatal(err)
	}

這邊可以看到:

  • 透過 cs := model.StartChat() 建立一個新的 Chat Session 。
  • 接下來將你的問題 (prompt) 透過 send()傳送,並且取得回覆 res
  • 這兩個資料都會自動儲存在 cs.History 裏面。

結合 Gemini-Pro 的 Chat Session 與 LINE Bot

看完了套件內提供的 Chat Session 之後,要如何跟 LINE Bot SDK 來做結合呢?

以 LINE Bot SDK Go v7 來舉例

因為 v8 有使用到 Open API (a.k.a. swagger) 的架構,整個方式不太一樣。之後會透過新的文章來說明。這裡透過大家比較熟悉的 v7 來舉例:

			case *linebot.TextMessage:
				req := message.Text
				// 檢查是否已經有這個用戶的 ChatSession or req == "reset"
				cs, ok := userSessions[event.Source.UserID]
				if !ok {
					// 如果沒有,則創建一個新的 ChatSession
					cs = startNewChatSession()
					userSessions[event.Source.UserID] = cs
				}
				if req == "reset" {
					// 如果需要重置記憶,創建一個新的 ChatSession
					cs = startNewChatSession()
					userSessions[event.Source.UserID] = cs
					if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage("很高興初次見到你,請問有什麼想了解的嗎?")).Do(); err != nil {
						log.Print(err)
					}
					continue
				}
  • 首先建立一個 map 存放資料為 map[user_Id]-> ChatSession
  • 如果在 key map 沒有找到,就建立一個新的。 startNewChatSession()
  • 詳細內容如下,裡面重點是透過 model 來啟動一個聊天 model.StartChat()
// startNewChatSession	: Start a new chat session
func startNewChatSession() *genai.ChatSession {
	ctx := context.Background()
	client, err := genai.NewClient(ctx, option.WithAPIKey(geminiKey))
	if err != nil {
		log.Fatal(err)
	}
	model := client.GenerativeModel("gemini-pro")
	value := float32(ChatTemperture)
	model.Temperature = &value
	cs := model.StartChat()
	return cs
}
  • 當然,如果覺得 token 可能爆掉。可以透過 reset指令來重新建立一個。

那真正聊天跟回覆要如何處理呢?

				// 使用這個 ChatSession 來處理訊息 & Reply with Gemini result
				res := send(cs, req)
				ret := printResponse(res)
				if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(ret)).Do(); err != nil {
					log.Print(err)
				}

其實就是透過 res := send(cs, req) 來將你的詢問的內容,發送給 Gemini Pro 並且接收相關回覆 res

只要這樣,不需要一步步將文字貼在 Chat context 之後。就可以達成一個具有記憶的聊天機器人。 幾件事情需要注意:

  • 要小心對話內容過長,會造成回覆精確度不夠高。
  • 要小心內容會讓你的 token 爆掉,造成無法取得回覆。

目前 Gemini Pro 的收費

截至筆者寫完(2024/01/03) 目前的定價依舊是 (refer Google AI Price)

  • 一分鐘內 60次詢問都免費
  • 超過的話:
    • $0.00025 / 1K characters
    • $0.0025 / image

image-20240103223633970

透過 Render 來快速部署服務:

由於 Gemini Pro 目前在某些額度下,還是免費的。這裡也更改了專案,讓沒有信用卡的學生可以學習如何打造一個 LLM 具有記憶的聊天機器人。

Render.com 簡介:

  • 類似 Heroku 的 PaaS (Platform As A Services) 服務提供者。
  • 他有免費的 Free Tier ,適合工程師開發 Hobby Project。
  • 不需要綁定信用卡,就可以部署服務。

參考: Render.com Price

部署步驟如下:

image-20240104140246518

  • 選擇一個服務名字

image-20240104140347932

成果

image-20240103225422373

根據以上的圖片,可以知道其實 ChatSession 相當適合打造 LINE Bot。

  • 只儲存使用者跟 OA 的相關對話。
  • 回覆的內容很適合在 OA 上面跟使用者互動。

但是使用 Gemini Pro 的 Chat Session 幾件事情需要注意:

  • 因為所以的記憶是儲存在 Services 的記憶體中,由於 Render.com 是會睡眠重啟的。到時候他會忘記。
  • ChatSession 是跟著 model 走的,也就是說: “gemini-pro” 跟 gemini-pro-vision” 兩個的對話是不能共用。

謝謝大家的觀看,也期待各位一起打造出

參考資料:

[線上演講筆記] Open-Source AI Projects at UC Berkeley & LMSys: Vicuna and Chatbot Arena

講者資訊

image-20231229105428746

UC Berkeley 的 Wei-Lin Chiang (Winston Chiang) 於 12/29(五) 來陽明交大演講, 主題是有關 Large Language Model (LLM), 尤其是將會提及他們在 UC Berkeley 開發的一個十分知名 LLM – Vicuna. 該LLM今年推出後即已有+500 citations, 超過百萬次下載, 江韋霖是主要作者之一. 歡迎有興趣的老師同學踴躍參與.

時間:112.12.29(五) 10:30-12:00

地點: 陽明交大工程三館 114室

演講者: Wei-Lin Chiang, 江韋霖 (University of California, Berkeley)

演講題目: Open-Source AI Projects at UC Berkeley & LMSys: Vicuna and Chatbot Arena

演講內容

Why Vicuna ?

image-20231229105447713

image-20231229105451665

image-20231229105522393

  • GPT-3 只使用 “Few-Shot” 開始產生其他語言結果。
  • LLM 成果遠遠比 NLP 的成效更好,開始大量投入相關的開發。

image-20231229105717094

  • 一開始 GPT3 只能 complete ,無法達到 Q&A 。

image-20231229105910058

  • 透過 “Instruct-GPT” 讓只會 Complete 的 GPT3 開始能做 Q7A

image-20231229105948247

image-20231229110601205

  • Stanford 做了 Alpaca ,於是 UC Berkeyley 也想做。

image-20231229110710361

  • 七萬筆數據。

image-20231229110926813

image-20231229111404311

  • 價錢便宜一半,資料量級跟 Stanford 差不多。

Vicuna - Demo site

https://chat.lmsys.org/

  • Data 經過清洗

image-20231229112737416

  • Blog 的影響:

    • 500 引用
    • 3M 訪問
    • 看圖的 model 也做了。

Vicuna - Limitation

image-20231229113011081

  • 數學, coding 有限制,回答不好。
  • 後來多拿相關資料去優化。

接下來面對問題:

  • 成功來自於「高質量」的數據 (data)

  • 支出不便宜,但是資料搜集不易。

  • 沒有好的 Evaluation 機制。

  • Benchmark 可能已經被 LLM 看過了。

Chat Area

image-20231229114908831

  • 開放的 ChatGPT (免費)
  • 有許多 model (開源)
  • 學校希望有更多回饋,與相關 RLHF 的資料。
    • 放上所有開源 models
    • 讓使用者評分相關問題,誰回答比較好。
    • 作為資料的搜集。

Onging Effort ?

  • 開始跟 HuggingFace 合作

image-20231229115703592

Q&A

  • LMSyS 是一個學生組織,未來發展方向是做開源 LLM 的 research 。
  • 很多開源模型都是使用外部 hosted (HuggingFace …)

更多參考:

[TIL][Heroku][Golang] 使用 Github Release 來 Deploy 服務到 Heroku

image-20231228233157290

Github Action 上的 CICD - Go Build

經常在教同學要打造自己的 side Project 的時候,要透過 Github 把自己的實際產品的想法表現出來。 其中,很重要的除了「文件的撰寫上」,那麼就會是「CICD」的實踐。


範例程式 Repo:

kkdai/bookmark-makerserver: A IFTTT MakerServer to help you post your tweet to github issue as a bookmark


在 Github Action 上有一個 Golang 基本的 CICD 工具 Golang Build

name: Go

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version: 1.21

    - name: Build
      run: go build -v ./...

    - name: Test
      run: go test -v ./...

這個就是 Github Action 提供的基本範本 ,可以讓你在 Pull Request 的時候跟 Merge 之後來跑 Go Build 的相關指令。

image-20231229000236139

Github 上的部署到 Heroku 的設定

這邊也可以參考一下 Heroku 提供的基本設定教學與安裝 Github Action 的方法

name: Deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: akhileshns/[email protected] # This is the action
        with:
          heroku_api_key: $
          heroku_app_name: "YOUR APP's NAME" #Must be unique in Heroku
          heroku_email: "YOUR EMAIL"

image-20231229000801996

原本設定: Merge 到 Master / Main 的時候 Deploy

但是裡面的設定都是 Push Master/Main 得時候才會啟動。這樣子其實有點麻煩,每一次的 Merge 到 Master/Main branch 都會發動部署。會讓像是 Document Update 的 PR 也會發動重複的 Deploy 。

如何改成透過 Github Release 來 Deploy?

這邊如果需要透過 Draft a new release 直接來選擇 deploy 到 Heroku 的話。就需要做以下修改。

name: Deploy

on:
  release:
    types: [created]

透過這個方式,就可以讓 Deploy 變得更加的直覺,

完成版之後的 CICD 流程與未來展望:

  • Pull Request –> Go Build 檢查程式碼可編輯程度。
    • 未來可以考慮加上一些 Test Coverage 工具來做單元測試,甚至是更多相關測試內容。
  • Murged 之後,也是跑 Go Build
    • 未來可以加上一些自動化文件更新的 action
  • Release 之後,就會 Deploy 到 Heroku 。
    • 目前都是 Cloud Services ,如果有多雲平台或是 Dev / Product 不同 cluster 可以分開來。

參考文件

[論文心得] Gemini vs GPT-4V: A Preliminary Comparison and Combination of Vision-Language Models Through Qualitative Cases

論文名稱: Gemini vs GPT-4V: A Preliminary Comparison and Combination of Vision-Language Models Through Qualitative Cases

image-20231228114149669

https://arxiv.org/abs/2312.15011

快速總結

裡面透過之前微軟發表過的論文中的相關測試案例外,本篇論文也加上幾個類別的案例。 tl;dr GPT-4v 比較簡潔中確性高,但是 Gemini-Pro 的敘述比較清楚。 裡面有很多圖片與相關案例,蠻值得一讀。

幾個有趣案例

當個偵探

都有看出幾個相關的點,蠻適合拿來做一些 side-project 。 :p

image-20231228114214976

判斷鞋子的品牌

有判斷出 NIKE Air Force 1 我覺得蠻厲害的。

image-20231228114301430

讀論文第一頁圖片

成效不錯,如果沒有 arxiv 的資訊可以抽取。這會是一個方法。

image-20231228114621106

[年終回顧] 2023 年的回顧與展望

2023 年度回顧

做一張人在回顧許多記憶的圖片,寫實風格,有著AI機器人對話,英國旅行,父母與小學女兒一起出去玩的圖片。

懶人包

今年最令人懷念的就是:

  • 八月的時候,來了一趟去英國跟法國的旅遊。
  • 因為去年 LLM 大爆發,今年有幸可以參加一堆好玩的專案與內部訓練。 (共有 28 個 new Repositories)

到了這個年紀,可以從事自己喜愛的工作,家人開心在一起,還有健康身體,真的很重要。

數據總結

image-20231226210639947

image-20231226210713001

  • 總共讀完: 2418 分鐘, 14 本書 (有 1 本其他平台)

    • 2022: 24 本書。
  • 部落格文章撰寫上:

    • 2023: 59 篇文章
    • 2022: 53 篇文章
  • 健身運動:
    • 2023: 3595 mins
    • 2022: 3966 mins
  • Github Contribution 上面:
    • 2023: 1062
    • 2022: 828
  • 因為 LLM 今年有許多專案: (共有 28 個 new Repositories)

  • 聚會方面, 2023 比較解禁今年也比較有機會看到更多老朋友:
  • 4 月可以跟東吳大學同學們聚餐。
  • 12 月跟 Corel 的老朋友見面。

image-20231226213125460

雜項數字

image-20231226213208547

image-20231226213211321

image-20231226213307846

image-20231226213829531