2024年6月29日 星期六

ThinkPad E15 開機無法偵測到 SSD 排除 - 2101: Detection error on Storage Device0 (M.2 Main Slot)

這台是 ThinkPad E15 2020年版,是疫情期間買給長輩用的平價筆電,在 2024.06 開機讀不到硬碟,由於已經沒有保固,再加上想要送回廠修理的方式,全台只有四個點且週末、假日不營業,實在不太方便,就乾脆自己修吧!


給原廠修的主因是想保有正版 Windows,省去煩惱一些資安問題,而自己處理則是可以加強隱私保護,確保沒人可以存取硬碟內的資訊,像是自己物理破壞掉也行。

研究了一下,據說 Windows 8 以後的筆電,會把 Windows 序號已經綁定在韌體上(BIOS?),因此筆電外殼也不會再貼序號貼紙,就這樣,只需看看能不能取得正版 Windows ISO 即可重新安裝:

首先,先研究一下如何拆筆電後蓋殼子,隨意找一下,發現有個 Youtube 影片教學快速看一下,剛好家裡也有個塑膠墊片就拿來開了!第一次沒經驗也把塑膠墊片弄得變形 XD 整體上需要一點點技巧的,可直接看官網 Support 教學影片:Lenovo Support 拆解與更換影片 > 底蓋拆卸

先買了一個 SSD 外接盒(非必要)想試試看救資料,結果失敗 Orz 看來 SSD 真的一壞了就難靠個人救了,要也得交給專業的來。回過頭來,也買一個特價中 MSI M371 1TB NVMe M.2 SSD 來使用,接著使用微軟官網下載的 ISO 檔,實際測試安裝都是失敗告收 XD 使用 Windows 10 或 11 的 x64 ISO 製成的 USB 安裝碟,永遠卡在要指定驅動程式的步驟:


原先還誤以為 SSD 沒抓到,跑去研究更新 BIOS 等事情,最終回想起 Lenovo USB Recovery Creator 工具,透過 Lenovo USB Recovery Creator 工具可以找到符合自己筆電的還原檔案(總共約11GB)並製作成還原隨身碟,必須找另一台 Windows 環境來運行該程式。整體上花 10分鐘下載資料,製作 USB 開機碟還要花個 20 分鐘。



終於,可以用 USB 還原隨身碟安裝 Windows 10 了:


以上步驟筆記:
經過了上述流程,終於筆電開起來是一個 Windows 10 Home 環境,接著就是一連串的 Windows 更新(數小時),預計最後要升級到 Windows 11 才收工,努力了 Orz 這時記得要先調整電源方案,調整成使用電源供電中不休眠。

當 Windows 10 安全更新至最新後,一直沒法收到 Windows 11 通知,只有一些 Windows 11 的簡介,像是跳轉到微軟官網看。後來透過以下方式可以更主動升級到 Windows 11:

2024年6月20日 星期四

AI開發筆記 - 使用 OpenAI API 對文字抽特徵向量 (embedding) 並使用 FacebookResearch Faiss library 作向量搜尋

之前公司已經訓練出簡單的 AI Model 做一些應用,想要使用 Retrieval Augmented Generation (RAG) 架構進行加強,現在就先想到靠 OpenAI API with text-embedding-3-small model 來對文字抽特徵向量,接著把它存起來,再透過 FacebookResearch Faiss library 建立搜尋架構(尋找相似的向量),就可以完成簡易的向量搜尋。

整體流程:
  1. 整理一份 FAQ csv 格式,並把問題的文字,使用 text-embedding-3-small 模型抽特徵向量
  2. 使用 python pandas 用 csv 結構存起來
  3. 從 csv 建構出 python pandas 結構,再轉成 Facebook Faiss 結構
  4. 把 query strings 使用 text-embedding-3-small 模型對文字抽特徵向量
  5. 再拿 query strings 特徵向量去搜尋相似向量,印出五筆資料

% python3 -m venv venv
% source venv/bin/activate
(venv) % python3 -V
Python 3.12.2
(venv) % sw_vers 
ProductName: macOS
ProductVersion: 14.5
BuildVersion: 23F79
(venv) % pip install -r requirements.txt 

輸入資料:

% cat .env 
OPENAI_API_KEY=sk-proj-XXXXXXXXXXXXXXXXXXXXXX

% tree data 
data
├── all_with_embeddings.csv
└── raw.csv

1 directory, 2 files

% head -n 1 data/raw.csv 
ID,Product,Question,Answer

% head -n 2 data/all_with_embeddings.csv 
ID,Product,Question,Answer,embedding
1,產品,如何安裝設備,1. 首先依照...,"[0.02327146753668785, -0.05237892270088196, ..., -0.001935890642926097]"

運行查詢:

% bash script_query.sh "我的設備沒有訊號,該怎樣處理"

2024年6月17日 星期一

2024生成式AI年會回放筆記 - 玉山銀行 GENIE: 金融服務建置生成式 AI 的困境與攻略


年初滑 linkedin 時就曾看到布丁提及 2024生成式AI年會 的活動,不過時間太遙遠,很難確保沒有期他活動會撞期(家庭第一)。後來還真的邊渡假邊看共筆筆記,第一眼就吸引我的是來自玉山銀行的徐銘霞的分享,自稱 GENIE 夫人,玉山銀行智能金融處主任工程師。從她的投影片中,已經可以窺探許多珍貴的研發經驗,包括從五人兼職的團隊做出POC後,跟長官要求資源(算力經費跟人力)成長到百人團隊,實在驚人,瞬間有感碰到貴人跟大公司資源的感慨,不是每個人都有這樣的緣分能被賞識且被投資,當然,不能抹滅的還是團隊的執行力。

由於網路上的討論文不算多,大多都被網紅 志祺七七 跟 薩泰爾娛樂 Sunny 給吸引走 XD 他們的分享文當然是很讚的,只是場域上跟我在意的 GAI 戰場不同,所以還是來寫一篇筆記吧!

我主要持續關注聯發科 DaVinci(達哥) 生成式AI平台,也加入 DaVinci (達哥)生成式AI平台社群 ,而玉山 GENIE 也正是同領域的!把玉山 GENIE 的分享+聯發科 達哥資訊拼湊一下,已經有非常多的乾貨可吸收。甚至財經網紅股癌在六月多集 podcast 也分享起聯發科達哥的一些細節。回過頭來,實在感恩有回放可以看,想到就覺得滿爽的,可以兩倍速以及不斷咀嚼片段,甚至講者沒有分享投影片也能從回放影片看到。

此場演講內容中,提到的玉山一開始切入點就是先做集團內的 ChatGPT 服務,做完再導入特定型應用的研發,接著提到全體公司使用率低,以及未來的規劃等。

一些足跡恰好讓我回想起近兩年公司的變化,先試著用 OpenAI API 包裝一些應用場景,如會議紀錄,可惜會議情境場域變化太多,想要靠同樣的 prompt 吃天下太難了,隨著時間,在 2024 年春天老闆搖旗吶喊,指派我幫公司導入 AI 輔助應用,當時研究幾輪後,先求個七十分,筆記了 企業導入 AI 輔助方案:廣義用法 ChatGPT / 設計行銷 Stable Diffusion 與 AI 主播 / 程式開發 Github Copilot 方案,其過程也研究了不少款對岸研發的 open source ,像是自行搭建 Private ChatGPT Web 的方式,或是 Coding 輔助抽換成各家 GAI API 方案等。

回到 GENIE 夫人 的演講內容,有一張投影片提到了整個研發時程:
  • [外部] 2022.11 ChatGPT 橫空出世
  • [內部] 2022.12 玉山行內 GAI 黑客松、LLM/RAG、PoC
  • [外部] 2023.02 Bing Chat
  • [外部] 2023.03 OpenAI GPT-4, Google Gemini 公布
  • [內部] 2023.03 玉山高階長官 GAI 科普課程、成立全行 GAI 工作小組
  • [內部] 2023.03 ~ 2023.06 玉山內部推廣 GAI WorkShop、GAI工作小組確認法規與需求
  • [內部] 2023.06 ~ 2023.09 建構通用型服務 GENIE 平台
  • [內部] 2023.09 ~ 2023.12 GENIE 試營運、開發特定型應用
  • [內部] 2024.01 GENIE 正式上線、特定型應用(RAG+GAI)上線測試
可以看到 GENIE 前期準備時程約 3個月(2023.03~2023.06),開發時程約 3個月 (2023.06~2023.09),試營運也是 3個月。其中,也看到玉山的 Best Practice 分享 - GENIE x RPA: 業務單位自行開發的負面新聞摘要日報,透過 RPA爬交易對手的相關新聞,每天利用 GENIE 判斷新聞為正面或負面,並提供摘要

我之前已接觸過一些 no code 服務略知一二,有些工程上要花大量心力研發的“模組”已經完全可以靠 LLM 頂替了。例如新聞的正面或負面的判斷上,可能一般人看到一兩句話沒有太多感觸,過去有緣在新創研發環境上,當時有個題目在做美食文章分析模組,粗略可以想成工程團隊:
  • 兩人開發 crawler 
  • 兩人開發分析模組,判斷文章是正面描述美食,還是負面描述美食
  • 兩人進行系統整合,並且建構出人機回饋評分架構,讓 n>5 位受過中文系專業訓練的成員評分模組判斷的正確性
這樣的人力配置,用 5位工程師來說嘴,一年就要燒掉 600~800萬的費用的。而現在,只要套用個 LLM 來判斷!真的很省錢。在另一場運輸領域的,也有用 OCR+LLM+RPA 加速百種紙本單據轉數位化的研發,有興趣都可以追一下。如李宏毅教授的線上課程【生成式AI導論 2024】第0講:課程說明,一開始也就舉這個為例:


回過頭來,真心感謝玉山銀行的徐銘霞的分享,如演講題目的“攻略“,想要把 AI輔助 導入公司使用真的很費心的,心有戚戚焉啊,包括並不是每個人可以從 ChatGPT 中得到成果,如同 Google Search 擺在眼前,高手跟普通人的搜尋效率還是天差地遠的。

這時就得佩服 志祺七七 推出的 simpleinfo.ai ,在業配腳本上規劃 SOP 來讓公司同仁能更快上手,這跟一些管理書籍提到高度相關,很多超強的大企業,其管理目標就是不斷將做事方式切得更細,目的是讓普羅大眾也能做好。

最後,有興趣可考慮看看 2024年會回放影片:videos.gaiconf.com/view/gaiconf1 ,感謝策展人李慕約,看完其他回放,才發現講者的議題都源自於策展人的規劃的,真收穫滿滿。

相關資訊:

2024年5月29日 星期三

2024 about time


前幾年趁 apple tv+ about time 特價台幣 90元收藏了。老實說,不曾再完整看過,夜深人靜時,還是會回想起片段的劇情,特別是人生的選擇,一旦做了選擇,正向的說,產生了新的變化,負面來說,已經無法退回到過去。

翻一下 blog ,原來七年前也曾 murmur 過,哈。

近幾年的變化,可能更加重偏心靈層面?似乎跟七年前不太一樣,唯一不變的是對時間的焦愁,只能不斷提醒自己,有些事該放下的。然後,開始重視人生資源的分配,六個罐子,雖然是被用在理財角度,其實最貴的是時間,包括自己周邊的親友和人事物。

像工作上碰到處理事情效率不佳的情況時,會退回一步想,是啊,大家都是混口飯吃的 XD 儘管資源重組(裁員)已成常態,但別把這當理由強推。許多管理書籍的重點也落在 SOP 這領域,重點是讓事情有進展,並且不依賴超強人才特質,實務上 overqualified 的人才也待不久的,卻也令人期待人才蛻變後,主管們多了這甜蜜的煩惱。

關於親友之間,反而被些大學好友不斷互相砥礪,持續增加自己的視野,但也能認清階級的差距。因資源不同而視野不同,煩惱也不同,絕對不會因此沒煩惱的。想起幾年跟總經理聊上幾句,我跟他分享同輩的在哪些美商陸商發展,他直接分享十多年前的別人挖角他的故事,翻翻手機內的聯絡人清單,某某某已經是該區域的 Top 50 富豪,當年跟著他的也 Top 100,但人生再來一次,是不是會放棄那個選擇?也著實是個有趣的議題。

回到自己的人生,越來越更重要的事需要珍惜,如何讓自己保有餘力去實踐,真的又是個 about time 的議題。每個人打從出生至今,每個階段拿到的手牌資源都不同,唯一不變的,仍是該好好的出牌。

2024年5月24日 星期五

Docker 開發筆記 - 使用 Dockerfile 透過 Ubuntu 18.04 建置 PHP7 + MySQL 5.7 + PHPMyAdmin 開發環境 @ macOS arm64

Ubuntu:18.04 + php7.2 + mysql5.7 + phpinfo();

此需求源自於舊網站的開發環境的建置,一般人不會碰到。

同事回報之前弄的 Docker 環境,因為從 Macbook Intel x86 架構,換到 Mac M2 ARM 環境後,出現問題。主因是網站使用很舊的 MySQL 5.6 環境,在 macos arm64 的 Docker 環境中,無法很便利的只用官方環境建置出來,預設只能直接升級到 MySQL 8 跑,接著還要面對 MySQL 5.6 跟 MySQL 5.7 以上的 SQL 語法變化。

在此的解法是放棄 MySQL 5.6 ,頂多弄出 MySQL 5.7 環境,並追蹤有哪些 SQL 語法需要修改,SQL語法方面,主要是面對 ONLY_FULL_GROUP_BY 模式的處理。此紀錄透過 Docker 弄個 MySQL 5.7 環境出來過度,且最終只需用 ubuntu:18.04 即可搞定大部分,以下是流水帳:

原先要用 Docker - Ubuntu 24.04 arm64 環境來使用,但追蹤後發現 Ubuntu 20.04, Ubuntu 22.04, Ubuntu 24.04 預設都只提供 MySQL 8 的環境,並且依照 MySQL APT Repository 的方式安裝 mysql-apt-config_0.8.30-1_all.deb 後,確認都沒 mysql-5.7 可選,而坊間其他教學文,主要是透過舊版 mysql-apt-config_0.8.12-1_all.deb 套件,在 Ubuntu 20.04 安裝了 mysql-5.7 ,但其過程是 mysql-apt-config 套件無法偵測出 Ubuntu 環境,透過人工選擇 Ubuntu 18.04 的環境裝到 mysql-5.7 而已,以下是個例子:

% docker run -it ubuntu:24.04 /bin/bash
root@2560222cf1ee:/# apt update && apt install -y wget lsb-release gnupg dialog
root@2560222cf1ee:/# wget https://dev.mysql.com/get/mysql-apt-config_0.8.30-1_all.deb
root@2560222cf1ee:/# dpkg -i ./mysql-apt-config_0.8.30-1_all.deb

MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you
wish to receive.

Once you are satisfied with the configuration then select last option 'Ok' to save the configuration, then run 'apt-get update' to load package list.
Advanced users can always change the configurations later, depending on their own needs.

  1. MySQL Server & Cluster (Currently selected: mysql-8.4-lts)  3. MySQL Preview Packages (Currently selected: Disabled)
  2. MySQL Tools & Connectors (Currently selected: Enabled)      4. Ok

Which MySQL product do you wish to configure?
Which server version do you wish to receive?

來試試看裝舊版 mysql-apt-config_0.8.12-1_all.deb:

root@2560222cf1ee:/# dpkg -i ./mysql-apt-config_0.8.12-1_all.deb
root@bc33821f13de:/# apt update
W: GPG error: http://repo.mysql.com/apt/ubuntu cosmic InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B7B3B788A8D3785C
E: The repository 'http://repo.mysql.com/apt/ubuntu cosmic InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
root@bc33821f13de:/# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Executing: /tmp/apt-key-gpghome.eheHF2erjp/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys B7B3B788A8D3785C
gpg: key B7B3B788A8D3785C: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
root@bc33821f13de:/# apt update
W: http://repo.mysql.com/apt/ubuntu/dists/cosmic/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
N: Skipping acquire of configured file 'mysql-tools/binary-arm64/Packages' as repository 'http://repo.mysql.com/apt/ubuntu cosmic InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'mysql-5.7/binary-arm64/Packages' as repository 'http://repo.mysql.com/apt/ubuntu cosmic InRelease' doesn't support architecture 'arm64'
N: Skipping acquire of configured file 'mysql-apt-config/binary-arm64/Packages' as repository 'http://repo.mysql.com/apt/ubuntu cosmic InRelease' doesn't support architecture 'arm64'

最後就輕鬆改用 ubuntu:18.04 ,再把 phpmyadmin 擺好即可,收工。

連續動作:

# Use the official Ubuntu 18.04 as the base image
FROM ubuntu:18.04

# Set non-interactive mode for APT
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Taipei
ENV PHP_VERSION=7.2

# Update the package list and install necessary packages
RUN apt-get update && \
    apt-get install -y tzdata && \
    ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && dpkg-reconfigure --frontend noninteractive tzdata && \
    apt-get install -y \
    htop \
    jq \
    vim \
    curl \
    wget \
    telnet \
    php7.2-cli \
    php7.2-curl \
    php7.2-fpm \
    php7.2-ldap \
    php7.2-mysql \
    php7.2-zip \
    phpunit \
    mysql-server-5.7 \
    ssl-cert \
    nginx \
    openssh-server && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

EXPOSE 22 80 443 8080 8443 3306

# Set up MySQL
RUN service mysql start && \
    mysql -e "CREATE USER 'developer'@'%' IDENTIFIED BY 'developer'; GRANT ALL PRIVILEGES ON *.* TO 'developer'@'%'; CREATE DATABASE developer; FLUSH PRIVILEGES;"

# Set up PHP-FPM Short Open Tag
RUN test -f /etc/php/$PHP_VERSION/fpm/php.ini && \ 
    sed -i 's/short_open_tag = Off/short_open_tag = On/' /etc/php/$PHP_VERSION/fpm/php.ini && \
    sed -i 's/max_execution_time = 30/max_execution_time = 300/' /etc/php/$PHP_VERSION/fpm/php.ini && \
    sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 100M/' /etc/php/$PHP_VERSION/fpm/php.ini && \
    sed -i 's/post_max_size = 8M/post_max_size = 100M/' /etc/php/$PHP_VERSION/fpm/php.ini 

# Set up phpmyadmin
RUN cd /tmp && \
    wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz && \
    tar xvzf phpMyAdmin-latest-all-languages.tar.gz && \
    mv phpMyAdmin-*-all-languages /usr/share/phpmyadmin && \
    mkdir -p /usr/share/phpmyadmin/tmp && \
    chown -R www-data:www-data /usr/share/phpmyadmin && \
    chmod 777 /usr/share/phpmyadmin/tmp

# Copy the entrypoint script
COPY nginx-php7.2-fpm-phpmyadmin.conf /etc/nginx/sites-enabled/phpmyadmin
COPY nginx-php7.2-fpm-website.conf /etc/nginx/sites-enabled/default 
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh

# Set the entrypoint
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

# Start services in the foreground
CMD ["bash"]

# Define a volume for mounting the local directory
VOLUME ["/var/www/my-website"]

運行:

% ls
Dockerfile nginx-php7.2-fpm-phpmyadmin.conf
README.md nginx-php7.2-fpm-website.conf
entrypoint.sh
% docker build -t test .
% mkdir /tmp/php
% echo "<?php phpinfo();" > /tmp/php/index.php
% cat /tmp/php/index.php 
<?php phpinfo();
% docker run -p 80:80 -p 443:443 -p 8080:8080 -p 8443:8443 -v /tmp/php:/var/www/my-website -t test
 * Starting MySQL database server mysqld                                                           No directory, logging in with HOME=/
                                                                                            [ OK ]
 * Starting OpenBSD Secure Shell server sshd                                                [ OK ] 
 * Starting nginx nginx                                                                     [ OK ] 
Fri May 24 21:42:43 CST 2024

如此,就可以用 http://localhost, https://localhost/ 看到 phpinfo() 的資料,而用 http://localhost:8080, https://localhost:8443/ 則會看到 phpmyadmin 網頁服務

要關閉時,記得找一下 container id:

% docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                                                                                        NAMES
a1631b90d924   test      "/usr/local/bin/entr…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp, 3306/tcp, 0.0.0.0:8443->8443/tcp   thirsty_booth
% docker stop a1631b90d924
a1631b90d924

 其他資訊:changyy/docker-study/ubuntu18.04-php7.2-mysql5.7-phpmyadmin