Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-addons-for-gutenberg domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /opt/bitnami/wordpress/wp-includes/functions.php on line 6114
Tech - 八寶周的研究小屋

Category: Tech

0. 前言


在正式進入到資料圖表之前,我們先來設置電子郵件,除了填補上期邀請用戶的缺口外,未來設定數據警報的接收信箱也算較為簡單的方式。

其設定的修改略微繁瑣,希望各位還能跟上步伐並保持熱忱!

1. 重點


Grafana 的設定無法從網頁介面進行修改
Gmail 經測試確認可以自訂寄信者的名稱,但無法遮蔽用戶的信箱

2. 內容


2.1. 檢查設定

左側選單中找到 Adminstration >> General >> SettingsCtrl + F 搜尋 smtp,此時可以看到預設情況沒有啟用且使用本地的信箱地址,若沒有經過完善的設定是沒法發信給別人的,後續我們就以 Gmail 來做替換。

沒有細查原因但 Grafana 即使有 Grafana Admin 最高權限也沒有辦法利用網頁介面進行修改,回到頂部也可看到提示請我們去調整 .ini 檔並重新啟動。

2.2. 調整設定

我們開啟 Terminal 輸入以下指令進入到容器並使用 root 權限,因為我們後續需要安裝檔案編輯相關套件。

PowerShell
docker exec -u root -it grafana /bin/bash

接著移動到該設定檔的位置,檢查是否有前述的檔案存在。

Bash
cd /etc/grafana/
ls

找到檔案之後我們就要開始進行修改,我們首先要先安裝文字編輯器,這邊我個人習慣是用 nano。

Bash
apt-get update
apt-get install nano -y

接著輸入以下指令進入檔案,接著按下 Ctrl + W 並搜尋 smtp,接著敲下 Enter 應該就會到該區塊之設定。

Bash
nano ./grafana.ini

我們修改以下幾個項目,過程記得刪除開頭的 ; 符號,那關於 SSL 與 TLS 安全協議的部分這邊從簡就先略過。確認完成後我們就透過 Ctrl + X >> Y >> Enter 儲存並重新啟動容器。

Bash
[smtp]
# 啟用信箱功能                                                                                                                
enabled = true
# SMTP 伺服端口                                                                                                         
host = smtp.gmail.com:587
# SMTP 所屬用戶                                                                                              
user = ${YOUR_OWN_EMAIL}                                                                                       
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
# 應用程式金鑰                           
password = ${YOUR_APP_PASSWORD}
# 略過憑證檢查 (SSL/TLS)                                                                                            
skip_verify = true
# 信件顯示信箱                                                                                                    
from_address = admin@grafana.localhost
# 信件顯示名稱                                                                                 
from_name = Grafana      

這邊我會建議使用其他信箱作為來源寄送到常用信箱,若使用與 user 相同的信箱在總攬會看到 me 的字樣。

2.3. 測試設定

首先重複步驟 2.1 透過 Grafana 的介面確認設定是否成功套用。

關於測試的部分不用等到未來綁定數據警報,記得上次我們談到組織用戶的邀請嗎?這次勾選寄送邀請信件並確定使用 eMail 進行登入帳戶。

接著就到信箱看看是否收到信件,話說不太清楚是 Gmail 有改過設定還是 Grafana 的問題,雖然顯示 from_name 的假名但信箱地址沒有更換。

3. 後話


透過 SMTP 的設定除了警報提醒外,在邀請用戶的邀請上也不用手動傳輸網址,觀感上也更有格調。畢竟屬於系統設定,就決定先提前作示範。

下回我們就來嘗試新增簡單的資料來源並製作儀表板吧!

4. 參考


[1] Configure eMail for Alerting — Official
https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-email/

  • Grafana – 帳戶與權限

    0. 前言


    無論是企業組織還是個人用戶,安全機制的設置都是不可忽視的課題。當涉及到系統的使用權限與資源訪問時,妥善的用戶與權限管理更顯得尤為重要。

    那關於 Grafana 針對企業的管理架構又如何呢?讓我們一探究竟!

    1. 重點


    組織 (Org) 是獨立的頻道,擁有各自的資料來源與儀表板
    系統總管 (Grafana Admin) 可以強制配發帳密,組織管理 (Org Admin) 只能邀請用戶
    團隊 (Team) 能加強組織的管理與迅速的資源發派
    金鑰 (Service Account Token) 目前還無法做到最小權限原則

    2. 內容


    2.1. 分立帳戶

    對於多數個人用戶對於帳戶分立肯定沒有感覺,畢竟就是自己操作肯定想要最高權限。但是這樣的優勢在於如果哪天 普通子用戶 被盜用,還能使用 管理員帳戶 登入並移除被侵略的帳戶。而對於組織而言該功能更加重要,畢竟多數員工不該掌握過大的權限。

    那首先點開左側選單找到 Administration >> Users and Access

    這邊可以看到總共分三個種類,User 就是通常登入到介面的帳戶,Team 則是將用戶分組方便管理,而 Service Account 則是用於 API 的憑證。

    2.1.1. 登入用戶
    2.1.1.1. 新增用戶

    首先我們就從用戶的建立開始,進入頁面後找到表格右上的 New User 並開始建立用戶。

    用來辨別的名稱 (Name) 與進行登入的密碼 (Password) 設置完成後,雖然沒有米字號但這邊 eMail 與 Username 需要至少填寫一個,那是登入時所必須的輸入資料。

    壓下建立用戶我們馬上就要來調整權限,這邊關於 Grafana Admin 的部份我就不做啟用,這項功能是讓該用戶能夠超出組織並操作整個系統,對於平常使用來說權限太高。

    另外要讓用戶能夠操作資源,我們需要指派組織資源並開通權限,這邊我們用上 Editor 權限就夠介面多數的操作。

    2.1.1.2. 邀請用戶

    如果使用組織的 Admin 權限用戶可以掌管組織內的所有人力資源,惡意人士也能偷偷塞入新的帳戶竊用資料,畢竟平常沒人會檢查用戶紀錄,再說人員一多也感覺不出來,所以一般不會隨意配與。

    另外以上介面其實與 Grafana Admin 分頁中的 Organization Users 是相同的。

    這時我們嘗試按壓 Invite,可以看到其密碼是交由受邀請者自行設定。這邊由於我們還沒設定 SMTP(下回),請先將 Send Invite eMail 取消後進行生成。

    完成後在右上角切換到 Pending Invites 分頁,此時我們能夠拿到一組網址,透過這種方式受邀請的用戶就能調整自己的密碼與個人資訊(就後者這部分不太合格)。

    2.1.2. 建立分群

    重新登入到管理員帳號,我們接著往下進到分群的部分,壓下 New Team 按鈕。

    我們輸入個團隊名稱就能進到下一步,並開始添加用戶進群。

    而團隊的概念是在組織建立區隔,就公司角度來說同是開發部門可能有不同的專案,透過這種方式能避免相互影響,也能避免逐個發派資源給予指定用戶。而隊內同樣區分管理人員與普通成員,這邊我們按下 Add Member 並選擇元戶與權限,接著 Save 新增入群。

    而設置的板塊主要則是控管偏好設定,除了樣式與首頁之外,主要考慮有些組織還有跨國的因素存在。

    2.1.3. 建立憑證

    最後來到自動化經常會用到的 API 呼叫,我們註冊一個 Service Account 進行憑證授權。

    這邊我們就先做為測試,使用基礎的 Viewer 權限且後續就會砍掉。

    在最底層我們先設定誰能取得金鑰,透過 Add Permission 還能看到這次我們分有 User 與 Team 都可選擇,而權限的部分則是 Edit 與 Admin 兩種權限,記得按下 Save 進行添加。

    接著我們按下表格右上的 Add Service Account Token 進行添增,這邊還能設置是否到期失效。滿有趣的是其預設時長是工作日 5 天而非整整 1 周。這邊金鑰記得保存起來,外來沒法再做查看。

    這邊展示另個帳號的狀態,上圖處在配與憑證之前,下圖則是配發之後,可以看到多出一個區塊。

    最後來實際嘗試看看,這邊使用該金鑰來查找其所屬的組織訊息。

    HTTP
    GET /api/org/ HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk

    各位稍微回想下流程是不是哪裡怪怪的?我們並沒有詳細設定金鑰有哪些權限,目前還沒法做到 fine-grained 去做最小權限原則。

    額外題下,雖然風險很高但其 API 也能透過 Basic Auth (帳密) 進行單個用戶的授權。

    2.2. 新增組織

    前面的案例我們使用的為預設的組織,那如果今天我們有外部合作夥伴,要與內部系統做區隔,又要如何新增組織呢?看到左側選單的 Administration >> General >> Organization 就能設定所有組織。

    馬上透過 New Org 快速建立一個組織,接著經過偏好設定就完成囉。

    當用戶有組織權限後,要做介面的切換只需在左上選擇組織就可以到不同的頻道囉。

    3. 後話


    儘管設置用戶和權限顯得繁瑣,但這些額外的步驟能大幅提升組織管理的效率與安全性。當資源共享需求提升時,清晰的權限管理不僅能確保內容的分隔,也能減少無意中修改關鍵數據的風險。

    隨著組織或個人逐漸擴大的規模,這些設置雖然麻煩卻能為長期的系統管理打下穩固的基礎,確保系統的高效運行與安全。

    4. 參考


    [1] Roles and Permissions — Official
    https://grafana.com/docs/grafana/latest/administration/roles-and-permissions/

    [2] HTTP API — Official
    https://grafana.com/docs/grafana/latest/developers/http_api/

  • Grafana – 簡介與安裝

    0. 前言


    在數據驅動的現代中資料視覺化已成為關鍵工具,清晰的圖表能夠幫助我們快速抓取核心問題並做出數據驅動的決策。

    促使數據不再僅是零碎的數字,而能組成實際意義的趨勢。而 Grafana 這樣的資料視覺化工具,正在資訊產業中發揮著不可或缺的作用。

    1. 重點


    注意 Docker 容器安裝有兩種 LINUX 環境~~

    2. 內容


    2.1. 基礎介紹

    Grafana 是開源的數據視覺化與監控工具,廣泛應用於系統監控以及數據分析。其特色在於強大的圖表自訂功能,使用者可以根據實際需求自行設計顯示方式,且支援多種 query 語法幫助使用者靈活地提取和處理數據。

    另外具備即時警報功能,當數據超過預設閾值時,可以透過 eMail, Webhook 等方式發送警報,提醒用戶盡早察覺異樣並做出反應。

    它的擴展性和多種整合功能使得它在現代 IT 監控和資料分析領域占據了重要地位。

    2.2. 容器安裝

    本篇採用 Docker 容器技術快速的進行安裝,但為避免後續刪除導致資料遺失,雖然 Grafana 只是視覺化的介面主體,但這些設定檔(資料來源,視覺介面)累積下來也是相當可觀,這邊建議建立 Volume 進行綁定。

    PowerShell
    docker volume create grafana-storage

    接著我們到【官網】查看最新版 Enterprise 的安裝方式,另外請讀者請自行調整最末端的映象名稱,更新為欲使用的版本與系統。以下指令會建立單個名為 grafana 的容器在 內外 3000 並綁定先前建立的磁碟空間。

    PowerShell
    docker run -d -p 3000:3000 --name=grafana --volume grafana-storage:/var/lib/grafana grafana/grafana-enterprise:11.2.0-ubuntu

    2.3. 介面登入

    接著我們到瀏覽器輸入 127.0.0.1:3000 ,或者你個人 VM 的 <私網 IP>:3000 ,應該能進到登入介面,預設的帳號密碼都是 admin

    登入之後建議更換密碼,確保資料安全避免輕易被其他用戶猜到。完成後就會導引到主控台,這樣我們就完成基礎的安裝,可以準備深入儀表板的視覺分析囉。

    3. 後話


    透過本文的介紹與安裝指南,將開啟關於資料視覺的起點。其潛力遠不止於此,未來你可以將它整合到更多資料來源,創建更加複雜的監控系統提供更深層次的支持。

    4. 參考


    [1] Container Installation Guide — Official
    https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/

  • [Python] 圖像處理 – Stable Diffusion 004 – ControlNet (2) Edge Detection

    [Python] 圖像處理 – Stable Diffusion 004 – ControlNet (2) Edge Detection

    【前言】

    在上次我們透過 Canny 簡單的生成線搞,但在 ControlNet 中卻有各式各樣的邊緣探測模型,那這些模型又有哪些不同呢?

    【重點整理】

    1. 不同的線搞模型有不同的適用情境
    2. 透過結合多個單元能增強各個的優勢

    【預計內容】

    1. Canny Edge Detection
    2. Lineart
    3. Soft-Edge
    4. Scribble
    5. Mobile Line Segment Detection (M-LSD)

    【主要內容】

    1. Canny Edge Detection

    之前的文章中,我們就曾提過 Canny 這支常用的方法,主要是仰賴 Thresholding 進行篩選,因此偶爾會有些斷點,但品質也有相對的保證。

    2. Lineart

    在 ControlNet 中,功能性最多的邊緣偵測大概就屬 Lineart 為主,在精細的情況也與 Canny 有得一拚。那統一使用原本的 lineart 模型就好,經測試後我認為與 lineart_anime 差別不大。

    那在所有風格中,我依照主觀的線搞精細度做出了以下排列。那我認為 Realistic 的線條過於僵硬, Standard 適合有陰影的部分,Coarse 相較適合髮絲,而 De-Noise 可能不要去碰。

    <Realistic>
    .
    <Anime>
    .
    <Coarse>
    .
    <Standard>
    .
    <Anime De-Noise>
    .

    那統整出大概的屬性,好奇心下當然要進行看看混和測試,這邊推薦下方兩組給各位

    + Lineart_Standard
    + Lineart_Coarse (ControlNet)
    + Lineart_Standard (ControlNet)
    + Lineart_Realistic (Prompt)

    3. Soft-Edge

    至於 Soft Edge,各位可以想像成柔邊,他的線搞相對寬而模糊,比較適合做輪廓的特效。那下方我便依照分類進行比對。

    <pidinet>
    .
    <pidisafe>
    .
    <hed>
    .
    <hedsafe>
    .
    <teed>
    .

    4. Scribble

    更進一步,Scribble 的線搞更加濃厚而簡單,那除了 xdog 以外的結果相對省略了許多細節,實測下來會稍微影響畫風。那接著我一樣按照稿圖精細度主觀地排列。

    <xdog> (Threshold: 12)
    .
    <xdog> (Threshold: 32)
    .
    <hed>
    .
    <pidinet>
    .

    5. Mobile Line Segment Detection (M-LSD)

    最後的 M-LSD 呢,只會抓取直線的部分,比較適合背景的區塊限制。

    【後話】

    那在這期中,我們統整出不同邊線探測的不同用途,透過結合各種優勢能夠併發出更多的可能性。那在下次會以區塊辨識與立體感為主軸,我們下次再會啦。

    【參考資料】

    [1] 範例用圖 — 胡桃 by あんべよしろう
    https://www.pixiv.net/artworks/93870151

    [2] ControlNet: A Complete Guide
    https://stable-diffusion-art.com/controlnet/

  • [Python] 圖像處理 – Stable Diffusion 003 – ControlNet (1) Reference

    [Python] 圖像處理 – Stable Diffusion 003 – ControlNet (1) Reference

    【前言】

    ControlNet 是對 Stable Diffusion 影響急劇的模型,概念是為生圖設立更多的限制,由於功能眾多我只以常用的為例,那這期為線搞生圖與骨架參考兩項,試著參考原圖生成相似的圖樣。

    【重點整理】

    1. 圖生圖對於 ControlNet 線搞轉圖顏色較淡,因此推薦用文字生圖
    2. Open-Pose + Reference + IP-Adapter 能生成較相像的圖像

    【重要設定】

    請先透過選單中的 Extensions >> Install from URL 下載 ControlNet for WebUI
    https://github.com/Mikubill/sd-webui-controlnet.git

    完成後重新啟動程式,應該會發現生成設定中多出一個選單

    【預計內容】

    1. Sketch to Image — Canny Edge Detection
    2. Skeleton — Open-Pose

    【主要內容】

    1. Sketch to Image — Canny Edge Detection

    對於不擅上色的人們總夢想著有自動上色的功能,然而現實很殘酷,圖生圖是透過參考圖的內容來生成而非延伸其內容,因此常有全身白且場景白的狀態,並與原圖架構不一致,那麼究竟如何解決這項問題呢?

    input
    output

    透過 ControlNet 我們執行 Canny Edge Detection,便能夠依賴該插件用原圖的邊線做限制來達成。

    Step. 1 — 點開設定介面,首先將線搞傳入,並按下 Enable 啟用這個單元,最後選擇 Canny 邊線預測。

    Step. 2 — 再來選用 Canny 的模型,我所使用的是作者提供的原模型。【模型下載處】

    完成之後,讓我們看看成品如何吧!很明顯參考了原本的線搞架構,十分地成功。

    canny edge detection
    output

    但在圖生圖與文字生圖的對照很明顯,相同的 seed 與 prompt 下,後者的效果更加理想。那我個人認為的原因,是圖生圖同時參考了白底,導致顏色偏淡,而形成不同的畫風。

    image-to-image
    text-to-image

    2. Skeleton — Open-Pose

    Open-Pose 目前有很多尷尬的境遇是:他是參考骨架生成新的圖,因此難保留原始風貌。接著,由於其是透過區塊分割做判斷,因此線搞圖一般是無法判斷出骨架的。最重要的,這個模型本身針對真人真物,因此動漫的圖也很常偵測不到。

    那在 Preprocessor,我習慣上是以最精準的 full 為主,那其中還有針對動物的 animal_openpose 可使用。

    嘗試線搞生骨架
    嘗試動漫畫風生骨架
    嘗試人形(Action Model)風格生骨架
    嘗試用真人 cosplay 生骨架(圖源:by 小柔 SeeU

    那我接著用人形的圖操作下去,點擊 Show Preview >> Run Preprocessor 就會跳出右側的黑框,接著按下 Edit 能開啟介面修改姿勢,這邊我簡單將骨架向右移動。姿勢不錯,但結果在衣著或臉型都完全不同。

    那有個辦法能讓圖更相像,便是透過 Reference 提取整張原圖的信息,並傳遞給 Open-Pose(兩個 Unit)。那我這時會建議 Reference Only 搭配 ControlNet is More Important,強化原圖訊息的占比。

    Prompt is More Important
    Balanced
    ControlNet is More Important

    那在這之上,我們能再依靠 IP-Adapter 更進一步,簡單說類似於圖片轉提詞的模型,那也因此要搭配 Reference 做使用,那我所使用的是 plus 加強版,但對於 GPU 不足的電腦代價是超級久的生成時間( 測試時 20sec→12min)。另外推薦將 Reference 改回 Balanced,避免明顯的重疊片段。

    + IP-Adapter
    .
    + Reference (ControlNet)
    + IP-Adapter
    + Reference (Balanced)
    + IP-Adapter

    那為了測試是否有必要用到最高規格,我又分別測試了 base 與 light 版來做對照(兩者都 17sec)。但結果出來真的是天壤之別,看來有必要空出 GPU 用量了。

    <plus>
    <base>
    <light>

    【後話】

    那這期先利用參考圖去做類似的生成就到這邊為止,那再下一篇我應該會以邊線的模型進行介紹,那我們下期再會拉。

    【參考資料】

    [1] 範例用圖 — 胡桃 by あんべよしろう
    https://www.pixiv.net/artworks/93870151

    [2] ControlNet: A Complete Guide
    https://stable-diffusion-art.com/controlnet/

  • [Python] 圖像處理 – Stable Diffusion 002 – Better Prompting

    【前言】

    在圖像生成中,最重要的莫過於詠唱的咒語。那究竟如何透過賦予提詞讓生成更加符合預期呢?

    【重點整理】

    1. 提詞的先後順序會影響權重(強度)

    【預計內容】

    1. 提詞的概念 — 正向與負向
    2. 提詞的權重 — 順序
    3. 題詞的權重 — 標記
    4. 提詞的組合 — AND 與 OR
    5. 提詞的時機 — 提詞切換點
    6. 提詞的時機 — 起始與結束幀

    【主要內容】

    1. 提詞的概念 — 正向與負向

    在提詞中,分有正向與負向兩種,那正向就是所希望出現的內容,反之,負向為不想要的內容。那最常見的正向詞有 masterpiece, best quality, 4k, ray tracing 透過以上這些都能大幅度的提升精細的程度,而常見的負向詞莫過於 nsfw 來避免色圖。

    而提詞的形式,可以混合多個單詞,或是句完整的敘述。

    2. 提詞的權重 — 順序

    權重簡單來說就是強度或占比,並且提詞的順序也會影響,因此越優先的題詞通常會放到越前面。那在下方我透過固定 seed(亂數的生成碼),來比對不同提詞的先後變化。那我所使用的基底為 v1.5 的 OrangeMixs 3 模型,更好的生成動漫風格。

    ray tracing, masterpiece, best quality, angry, tightened jaw, squinted eyes, and raised eyebrows, (dark brown hair), brown ears, aqua shining eyes, anime girl with long hair holding a sword in front of a fire, [cyan:0.7 AND black:1] coat
    ray tracing, masterpiece, best quality, (dark brown hair), brown ears, aqua shining eyes, anime girl with long hair holding a sword in front of a fire, [cyan:0.7 AND black:1] coat, angry, tightened jaw, squinted eyes, and raised eyebrows,

    看完兩張圖,相信各位都覺得表情幾乎沒有差別,但可以看到,在右圖中更強調場景與人物的精緻度。所以透過各種嘗試,我們漸漸的能統整出那些細節其實能放在尾巴。

    3. 題詞的權重 — 標記

    但一定要把優先的題詞放到最前面嗎?每次都還要調整順序可麻煩了,或者,我希望提詞更加顯眼 / 減少出現。因此,標記的語法更為重要,透過調整詞彙的權重,順暢的打字又能刻劃更多的細節。

    我個人統一使用 ( ) 進行標記,就不用記算比如 [] = 0.952 與 ((( ))) = 1.331 這類麻煩的數學 [2]。假設你想要強調就 x > 1,想要減少就 1 > x > 0,想要避免就 0 >= x,假設用法如 (masterpiece:1.2),代表 * 1.2 的權重。那要注意那你沒有設定數值,( ) 預設為 * 1.1 的權重。但一般設限在 2 > x > -2 之間,越多的權重變化越容易造成變質,生成許多的噪點(noise)。

    (aqua shining eyes:2)
    (aqua shining eyes:1.2)
    (aqua shining eyes:0)
    (aqua shining eyes:-2)

    4. 提詞的組合 — AND 與 OR [3]

    在多數情況下,我們會遇到組合的情況,包含「共存與混和」或「隨機」,則分別就要使用 AND 與 OR 來做處理。

    (dark brown hair AND red AND blonde) hair
    (dark brown hair OR red OR blonde) hair

    5. 提詞的時機 — 提詞切換點

    若我們依靠開始與結束幀來判斷不同題詞的切換時間會浪費大量的字數,因此 Automatic1111 實際上有提供 [prompt1:prompt2:z] 該語法,代表在第 z 幀時切換只生成 prompt2,而在此前會使用 prompt1。

    [red eyes:blue eyes:11],可以看到前期有紅眼,而到 11 幀後開始混合藍眼,最終生成偏黯淡的眼睛

    6. 提詞的時機 — 起始與結束幀

    我決定把這項功能移到最後,雖然這是我們少會動的功能之一,但最主要是我在測試上一直出問題,但官方文件 [4] 又說有這功能,讓火大又趕著睡覺的我只好介紹但無法正常呈現。

    那前面我們說到建議統一用括號,因為在這邊又會用到 [ ] 表示法,單冒號的 [ :x] 代表從第 x 帧開始,而說冒號 [ ::y] 代表從第 y 幀移除。

    [[cat::12]:10], walking in the train station,但可以看到分明在 Step 6 就已經出現動物的形體

    【後話】

    透過以上這些小技巧,都能提升精細度與工作效率。那在下期,我們就會開始介紹實用的兩個插件,最終,再以外部模型來做收尾。

  • [Python] 圖像處理 – Stable Diffusion 001 – Intro and Installation

    [Python] 圖像處理 – Stable Diffusion 001 – Intro and Installation

    【前言】

    在初期,AI 圖像生成有著許多瑕疵受人詬病,以及種種版權問題。然而其後續依舊蓬勃的發展,不斷的增強與改進,而發展最中心便是 Stable Diffusion,伴隨著越來越多開源的模型與插件,甚至於 Nov. 2023 提出能夠將圖片轉類似 gif 的動畫效果的新模型。那到底,Stable Diffusion 為何如此受歡迎又如何使用呢?

    【預計內容】

    1. Stable Diffusion 介紹
    2. Stable Diffusion 的應用
    3. 安裝 Automatic1111 的介面工具
    4. 淺談 AI 生成與繪畫創作

    【主要內容】

    1. Stable Diffusion 介紹 [1]

    Stable Diffusion 在 2022 年便已推出,其主要架構元件包括變分自動編碼器、正向和反向擴散、雜訊預測器和文字調整。本質上為擴散模型卻有獨特之處,並非依靠像素空間(Pixel Space)而是潛特徵空間(Latent Space),大幅降低處理的需求。一般家用的顯卡也足以支撐其工作量,但若想生成高像素的大圖,至少要超過 RTX3050Ti 4GB (我的筆電規格)以上的顯卡才能夠驅動。

    再拉回來,而除了本體的生成模型之外,後來官方也支援越來越多,最知名的莫過於 LoRA 系列的後處理模型。而伴隨著開發者的投入,又有如 ControlNet 這種知名的套件增加處理精細度。最終造就這個仍舊不衰且不斷精進的社群。

    目前主要使用的版本有 v1.5(非官方的優化),v2.1,v1.0 XL 三種。XL 是指特大模型,生成時間會久上許多且個人認為品質也沒差太多;雖然 v2.1 速度快且設備需求更低,但 v1.5 作為長期下來的累積,是截至目前(Mar. 16, 2024)外部模型最多的分支。

    2. Stable Diffusion 的應用

    剛剛我們說到 Stable Diffusion 的運作,那又能用來處理那些事項呢?該模型本質上不設限生成內容,因此色情與血腥的內容也能夠生成(但請注意使用規範)。那用來生成圖像自不用多說,開頭提到 Stable Video Diffusion 目前還算是概念 [2],究竟有什麼其他用途呢?

    依靠 ControlNet 插件,我們能透過分析線搞進行圖生圖,分析深度圖增加空間感,利用 open-pose 控制角色的骨架。透過 Inpaint 插件,也能夠輕鬆的進行雜物去除的遮罩。單單生圖之外,更重要的是增強與後製還有延伸應用。

    圖 1:本人測試 Open-Pose 捉取人物骨架的畫面

    3. Automatic1111 的介面程式安裝

    這位創作者提供的 WebUI 算是最知名的,並且有持續更新(發文前兩周),是一個利用 Gradio 介面能夠控制各種功能的全方面工具。那跟著步驟安裝時請確認 Python 版本為 3.10,怕影響環境的朋友可以參考 venv。

    圖 2:本人進行 ControlNet 線搞轉圖片測試畫面

    Step. 1 — 複製 github 專案

    請先安裝好 git 到本機,便能透過以下指令複製專案到本地了。

    BAT (Batchfile)
    git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

    Step. 2 — 進行安裝

    先進入到 Python 3.10 的環境中,進入專案位置後,輸入

    BAT (Batchfile)
    ./webui-user.bat

    第一次執行,會自動在專案內建立 WebUI 專用的 venv,並且安裝 Stable v1.5 模型等物件,因此執行時間稍久。之後執行也當是靠這個指令。

    4. 淺談 AI 生圖與繪畫創作

    由於作者本身有在學畫,起初也覺得 AI 生圖就是來搶飯碗、不入流的東西。那由於 AI 的量產性,也確實導致如 ArtStation / Deviant Art / Pixiv 等平台遭受洗版,甚至到後來爆發了反 AI 運動。但我必須承認 AI 在這領域越來越成熟,到了 Pixiv Fanbox 必須封禁的程度。那我也逐漸開放,視 AI 生圖為繪畫參考資料或生產工具。

    但對於繪畫的風格,現在還是傳統繪圖更有表現張力,情緒與細節更佳的豐富。因此,對於老派的我們認為傳統繪圖還不會被取代。那對於學畫的我,就想說是否能依靠 Stable Diffusion 更改參考圖片的風格與表達手法,讓傳統繪圖能夠更加精深,並且對於學畫的人能不在依靠觀察角色自己比劃如何排版,修修改改,而有個更直觀的感受與學習素材。

    【後話】

    Stable Diffusion 是非常強大的工具,無可厚非的影響了繪畫領域,也提供了效率的工作模式。那在之後的文章中,將帶領各位各家熟悉此項工具,那我們下期再會。

    【參考資料】

    [1] AWS — What is Stable Diffusion
    https://aws.amazon.com/what-is/stable-diffusion/?nc1=h_ls

    [2] Introduce to Stable Video Diffusion and Model Download

    https://stability.ai/news/stable-video-diffusion-open-ai-video-model

  • [Tech Talk] — Open-Source Gemma 語言模型

    [Tech Talk] — Open-Source Gemma 語言模型

    【前言】

    在 Feb. 21, 2024,Google 正式推出 Gemini 系列的旁支開源模型 — Gemma 語言模型。那麼究竟其效果如何呢?是否適合作為免費的 LLM 結合自己的程式呢?

    【重點整理】

    1. 該模型對於 GPU 的需求極高
    2. 其準確性仍待商確,且該模型不會隨意回答

    【預計內容】

    1. Gemma 介紹
    2. Transformer 版模型安裝方式
    3. 實測效果

    【主要內容】

    1. Gemma 介紹 [1]

    據官方所言,Gemma 與 Gemini 為相同研究所生並擁有相同的模型架構。目前釋出有 2b 與 7b,各別還有延伸後的 it (instruction tuned) 變形。而其模型所支援的平台主要有 Keras, PyTorch (Linux + Docker), Transformer 三隻,更多類型可見資料 [2]

    圖 1:各領域比較圖(圖源:資料 [1])

    2. Transformer 安裝到 Windows

    PyTorch 版是最開放且能修改模型的,然而由於轉換 bash 到 batch 失敗,我只好轉到 Transformer 之上,總之,讓我們開始吧。

    Step. 1 建立虛擬環境(這邊使用 Python 3.10.11)

    為避免套件衝突與覆蓋,我透過 venv 直接建立專門的環境。那成功進入後應該會在 Terminal 左側看見 (.venv) 的字樣,就代表操作正確,後續的指令與套件安裝都會在這個資料夾。

    BAT (Batchfile)
    # 建立 v3.10 的模擬環境
    py -3.10 -m venv .venv
    # 進入環境
    .\.venv\Scripts\activate

    Step. 2 安裝 Hugging Face CLI

    由於 Transformer 會尋找 Hugging Face (HF) 上的模型並安裝到緩存,我們需要先登入 HF 方便後續操作。麻煩請自行到 HF 新增一組 READ 權限的 Access Token 進行登入。

    BAT (Batchfile)
    # 新增 Hugging Face 套件準備下載模型
    pip install --upgrade huggingface_hub
    # 使用 Hugging Face {read} 的金鑰登入
    huggingface-cli login

    Step. 3 安裝必要套件

    麻煩各位先到 PyTorch 官網 搭配 CUDA 版本進行安裝(除非你想用 CPU 運算)。完成後再到 Terminal 輸入下方的指令,安裝 Transformer 與 GPU 加速的套件。

    BAT (Batchfile)
    pip install -U transformers accelerate

    Step. 4 模型安裝與執行

    等待安裝完後,可複製下方指令進行 CPU 或 GPU 運算,那在第一次會安裝模型。再稍帶片刻便會打印出所詢問的問題與答覆。

    【備註】
    1. 2b 足足有 10 GB,而 7b 則有 17.1 GB,請在良好網路環境下安裝

    Python
    '''CPU'''
    
    from transformers import AutoTokenizer, AutoModelForCausalLM
    
    # available models: ['gemma-2b', 'gemma-7b', 'gemma-2b-it', 'gemma-7b-it']
    tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b")
    model = AutoModelForCausalLM.from_pretrained("google/gemma-2b")
    
    input_text = "Write me a poem about Machine Learning."
    input_ids = tokenizer(input_text, return_tensors="pt")
    
    outputs = model.generate(**input_ids)
    print(tokenizer.decode(outputs[0]))
    Python
    '''GPU'''
    
    from transformers import AutoTokenizer, AutoModelForCausalLM
    
    # available models: ['gemma-2b', 'gemma-7b', 'gemma-2b-it', 'gemma-7b-it']
    tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b")
    model = AutoModelForCausalLM.from_pretrained(
        "google/gemma-2b", device_map="auto")
    
    input_text = "Write me a poem about Machine Learning."
    input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
    
    outputs = model.generate(**input_ids)
    print(tokenizer.decode(outputs[0]))

    3. 實測效果

    個人遇到的情況,是簡單對答利用 4GB RTX 3050Ti 也要執行 40 多秒,因此判斷不適合個人使用者融入到需要即時性的應用程式之中。而且相同問題,時好時壞,也因此對於短句的分析存有疑慮。

    【後話】

    那在上方我們帶過如何使用 Transformer 下載並使用 Gemma,可以看見其模型具有一定大小,對於 GPU 也有強烈的需求。因此,我個人目前暫不看好,且不認為會有更多的改變。若小型開發又要求即時性的話,與其租賃機台,貌似不如儲值官方的 Gemini 或 OpenAI 的 API,使用他們的設備進行處理。

    【參考資料】

    [1] 官方通告與模型
    https://blog.google/technology/developers/gemma-open-models/

    [2] Kaggle Model Card
    https://www.kaggle.com/models/google/gemma

    【延伸閱讀】

    [1] Buidling Gemma with CLI on Ollama

    https://ollama.com/library/gemma

    https://anakin.ai/blog/how-to-run-google-gemma-locally/