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
September, 2024 - 八寶周的研究小屋

Month: September 2024

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/

  • AI 本地模型 – Stable Diffusion

    AI 本地模型 – Stable Diffusion

    0. 前言


    Stable Diffusion 在圖像生成領域長期展現卓越的成績,甚至引起繪畫市場的洗板與恐慌,如今已然到第三代。那如果只是基礎功能的使用,實際上不用費工的安裝 Web UI 並透過 API 進行呼叫。

    在本篇文章我們將探討在不安裝 AUTOMATIC1111 的 Web UI 的情況下,如何在專案中直接使用。

    1. 重點


    需要準備至少 7 GB 的磁碟空間

    2. 內容


    2.1. 準備環境

    各位可以回顧【PyTorch 環境安裝】事前在 venv 中安裝所需之環境。

    由於 SD2 與 SD3 擁有極大的 GPU 要求,範例這邊採用基礎的 SDXL 1.0,從官方的範例稍作修改增加更多的調整項目。

    Python
    from diffusers import AutoPipelineForText2Image
    import torch
    
    pipeline_text2image = AutoPipelineForText2Image.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        variant="fp16",
        use_safetensors=True,
    ).to("cuda")
    
    # The positive prompt
    pos_prompt = "Futuristic city skyline with flying cars, cutting-edge AI technology, holographic interfaces, sleek designs, vibrant and glowing, 8k, highly detailed"
    # The negative prompt
    neg_prompt = "dystopian, dark, old technology, broken machines, messy environment"
    
    # The number of denoising steps
    num_inference_steps = 20
    #
    guidance_scale = 7.0
    # The size of the result
    width = 768
    height = 768
    # The number of images generated
    num_images_per_prompt = 1
    
    
    image = pipeline_text2image(
        prompt=pos_prompt,
        negative_prompt=neg_prompt,
        guidance_scale=guidance_scale,
        width=width,
        height=height,
        num_inference_steps=num_inference_steps,
        num_images_per_prompt=num_images_per_prompt,
    ).images[0]
    
    image.save("result.png")
    

    此時我們需要另外安裝 diffusers 套件,在專案 Terminal 內輸入以下指令進行安裝 or 更新。

    Python
    pip install -U diffusers

    2.2. 嘗試生圖

    在 HuggingFace 下載模型前,由於該模型屬於受管控的,我們必須填寫頂層的表單後才擁有權限使用。

    在 CLU 有登入 HuggingFace 的情況下,複製剛才頁面上的程式實際跑一次,便會開始下載模型。設備偏弱的讀者可以另外調整圖片的寬高,減少系統的負擔,不過記得 SDXL 在 768 到 1024 pixels 的範圍效果較佳。

    當完成後就能看看最終成效如何囉!

    3. 後話


    事實上 SDXL 還是多數用戶使用的模型,不僅僅在於設備的限制,同時也歸咎於【Civitai】過往累積的大量偏旁模型可以進行調整。

    但總歸來說最基礎的引入就足以包辦許多的業務,雖然許多網頁提供免費生圖,但在開發層面則可以省下許多呼叫的生成費用。

    4. 參考


    [1] SDXL 1.0 — Official Docs on HuggingFace
    https://huggingface.co/docs/diffusers/using-diffusers/sdxl

  • AI 本地模型 – PyTorch 環境安裝

    AI 本地模型 – PyTorch 環境安裝

    0. 前言


    在 AI 萌發的世代越來越多組織投入到模型的訓練,不只企業專用還有免費開源。相對於使用網頁產品受到代幣或會費的限制,在擁有夠力的設備下,我們也能夠自己運行略為遜色但免費的服務。

    趕緊來看看如何在本地設置環境準備運行開源模型吧!

    1. 重點


    CUDA 版本建議較新版本,涉及到系統與外部程式支援的程度
    PyTorch 相容的 CUDA 稍晚於 NVIDIA 最新發布的版本
    PyTorch 不同的套件版本兼容不同的 CUDA 版本

    2. 內容


    2.1. 檢查 CUDA

    針對所使用的 NVIDIA GPU 設備,我們必須另外安裝 CUDA Toolkit 讓電腦知道顯卡的位置以進行使用,若沒有經過正確的流程則沒法正確驅動,變相使用 CPU 而非 GPU 導致很多人抱怨執行時間過長。

    關於如何選擇 CUDA 版本,我們首先到【顯卡與運算兼容】找到自己顯卡的 Compute Capability 數值,如我的設備在下圖標註處而其數值為 8.6 ,相對屬於較新的資源(本篇完成時最新為 9.0)。

    接著我們到【架構與對應版本】看到表格,找到對應的 Compute Capability 以及其支援的 CUDA 版本間距。可以看到較舊的型號不再維護,而目前多數則支援到最新的版本,但最低的支援版本各不相同。

    ArchitectureCUDA CapabilitiesFirst CUDA Toolkit SupportLast CUDA Toolkit SupportLast Driver Support
    Fermi2.0CUDA 3.0CUDA 8.0R390
    Kepler3.03.2CUDA 6.0CUDA 10.2R470
    Kepler3.53.7CUDA 6.0CUDA 11.xR470
    Maxwell5.05.25.3CUDA 6.5OngoingOngoing
    Pascal6.06.1CUDA 8.0OngoingOngoing
    Volta7.0CUDA 9.0OngoingOngoing
    Turing7.5CUDA 10.0OngoingOngoing
    Ampere8.08.6CUDA 11.0OngoingOngoing
    Ada8.9CUDA 11.8OngoingOngoing
    Hopper9.0CUDA 11.8
    CUDA 12.0
    OngoingOngoing

    版本差距不只在於系統的變動,同時有包括外部程式的兼容性,因此還是建議安裝較新的版本。比如【此篇詢問】也是我所遇到的議題,本來 CUDA 11.7 跑得好好的,由於其他程式需要更新 Visual Studio 2022 結果就導致專案錯誤,加上 Community 版沒法回朔,只好加裝新的 CUDA,順道就寫下這篇記錄。

    2.2. 匹配 PyTorch

    確認完 CUDA 版本後別急著下載最新版,畢竟涉及 CUDA 的系統變動與套件維護,PyTorch 支援的版本與 NVIDIA 最新的版本難免形成差距。

    來到【PyTorch 官網】稍微往下滾動,壓下 Get Started 進到安裝介面。

    按照自己的設備與需求設定後,底層將會產生安裝的指令。此時注意到指令末端有 /whl/cu124 字樣,在安裝過程中該 PyTorch 內建只會尋找 CUDA 12.4,因此安裝 11.8 或 12.6 都是沒法正確運行的。

    在部分 HuggingFace 或 GitHub 開源模型的安裝方式中可能存在 –index-url 之參數,此時我們就必須額外安裝其他版本的 CUDA Toolkit 避免 PyTorch 套件版本不同的差距引發錯誤。

    2.3. 安裝 CUDA

    再度回首來到【CUDA Toolkit Archive】並選擇 PyTorch 的對應版本,接著依照系統選擇並開始安裝。

    等到下載器準備好就能夠執行,過程中維持預設即可,慢慢等待安裝完成即可。

    安裝完成後我們開啟 powershell 並輸入 nvidia-smi 指令,此時應該能跳出當下的顯卡資訊。

    (卸載不完全,導致 CUDA 版本顯示為 12.6)

    2.4. 安裝 PyTorch

    建議使用 venv 進行環境的分隔,隨著專案越多雖然占用大量的儲存空間,但相對好集中管理,且避免不同專案的套件版本發生衝突。

    我們複製在 2.2 取得的指令並開始進行漫長的安裝,在等待期間我們先建立一個 Python 檔案等會用來檢測系統設備。簡單解釋一下邏輯,當 CUDA 支援時則會使用 GPU 並回報首個設備的資訊,否則使用 CPU 。

    Python
    import torch
    import logging
    
    # Set up logging configuration with a prettier format
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s | %(levelname)s | %(message)s",
        datefmt="%Y-%m-%d %H:%M:%S",
    )
    logger = logging.getLogger()
    
    # Define the dashboard border
    border = "=" * 60
    section_divider = "-" * 60
    
    # Check if GPU is available and set the device
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    # Print device type (GPU/CPU)
    logger.info(border)
    logger.info(f"⚙️  Using Device: {device.type.upper()}")
    logger.info(border)
    
    # Additional info when using CUDA (GPU)
    if device.type == "cuda":
        gpu_name = torch.cuda.get_device_name(0)
    
        total_memory = round(
            torch.cuda.get_device_properties(0).total_memory / 1024**3, 1
        )  # Total GPU memory
    
        logger.info(f"🖥️  GPU Name: {gpu_name}")
        logger.info(f"📊 Total GPU Memory: {total_memory} GB")
        logger.info(border)
    

    確認 PyTorch 安裝結束,我們就來測試看看是否能讀取到顯卡資訊。

    Python
    python <上述 .py 路徑>

    3. 後話


    當我們確認好正確安裝與配置後,就可以安心地進入模型開發與探索的階段了。

    無論是進行深度學習的訓練,還是處理其他複雜的計算任務,擁有良好的驅動環境將確保你的工作流程順暢無礙。未來就讓我們一起探索模型的潛力,開啟 AI 領域的全新旅程吧!