Hugging FaceモデルをUbuntuで動かす!自前LLM構築ガイド (1) サーバーセットアップ編

未分類

関連記事

はじめに

当記事は、LLM構築前のサーバーセットアップ手順です。
今回用意したサーバーは以下です。

項目 内容
モデル Dell PowerEdge R760
CPU Intel Xeon Gold 5415+ ×2(2.9GHz / 8コア16スレッド ×2 / 合計16コア32スレッド)
メモリ 32GB RDIMM DDR5-5600 ×4(計128GB)
ストレージ(SSD) 960GB SSD SATA 6Gbps 2.5インチ ×2(RAID 1構成)
GPU NVIDIA L40S(PCIe, 350W, 48GB GDDR6)

今回は以下をセットアップします。

  • OS: Ubuntu Server 24.04 LTS
  • ミドルウェア: Python, nvidia driverの最新版.
  • ネットワーク: 最初はローカルIPのみで対応.あとからグローバルIPを追加する.

SSHからログインして初期設定

パッケージを最新にアップデート

# apt update
# apt full-upgrade
# apt autoremove

JSTに変更

# timedatectl set-timezone Asia/Tokyo

ホスト名の設定

# hostnamectl set-hostname aitest.ai-stack.jp

rootユーザーのパスワード変更

# passwd
→ xxxxxxxx

IPv6を無効化

# vi /etc/default/grub
> GRUB_CMDLINE_LINUX="ipv6.disable=1"
# update-grub

sshdの設定

root での ssh ログインを無効化

# vi /etc/ssh/sshd_config
- #PermitRootLogin prohibit-password
+ PermitRootLogin no

ユーザーのパスワード認証を無効化して鍵認証にする

# vi /etc/ssh/sshd_config
- #PasswordAuthentication yes
- #PermitEmptyPasswords no
+ PasswordAuthentication no
+ PermitEmptyPasswords no

ssh-rsaの鍵も利用できるようにする

# vi /etc/ssh/sshd_config
+ PubkeyAcceptedAlgorithms +ssh-rsa

外部設定ファイルを削除

# rm /etc/ssh/sshd_config.d/50-cloud-init.conf

ほかサーバにsshするときにssh-rsaの鍵も利用できるようにする

# vi /etc/ssh/ssh_config
+     PubkeyAcceptedAlgorithms +ssh-rsa
+     HostkeyAlgorithms +ssh-rsa

管理用ユーザにsuして秘密鍵公開鍵を作成する

# su - ai-stack
$ ssh-keygen -t rsa
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa
$ exit

秘密鍵を使った管理用ユーザログインを確認する

# systemctl restart ssh
> 別コンソールから ai-stack ユーザで秘密鍵認証の確認

firewall(ufw)の設定

# vi /etc/default/ufw
- IPV6=yes
+ IPV6=no

# ufw default REJECT
# ufw allow from 192.168.8.0/24 to any app OpenSSH comment 'SSH from Local'
# ufw enable
# ufw reload

Ctrl+Alt+Del の無効化

# systemctl mask ctrl-alt-del.target

chrony の設定

# apt install chrony
# vi /etc/chrony/chrony.conf
- pool ntp.ubuntu.com        iburst maxsources 4
- pool 0.ubuntu.pool.ntp.org iburst maxsources 1
- pool 1.ubuntu.pool.ntp.org iburst maxsources 1
- pool 2.ubuntu.pool.ntp.org iburst maxsources 2
+ pool 210.173.160.27 iburst
+ pool 210.173.160.57 iburst
+ pool 210.173.160.87 iburst

# systemctl enable chrony
# systemctl restart chrony
# chronyc sources
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.jst.mfeed.ad.jp          2   6     7     1    -73us[+3126us] +/-   79ms
^+ ntp2.jst.mfeed.ad.jp          2   6     7     1    +11us[+3211us] +/-   72ms
^+ ntp3.jst.mfeed.ad.jp          2   6     7     1   -197us[+3002us] +/-  101ms

リブート

# shutdown -r now

各種パッケージインストール

aptコマンドでrecommendsやsuggestedのパッケージをインストールしない

# vi /etc/apt/apt.conf.d/00no-install-recommends
APT::Install-Suggests 0;
APT::Install-Recommends 0;

emacs, git, zsh のインストール

# apt install emacs-nox anthy-el plocate zsh net-tools

Syslogの設定追加

# vi /etc/rsyslog.d/50-default.conf
- *.*;auth,authpriv.none          -/var/log/syslog
+ #*.*;auth,authpriv.none          -/var/log/syslog
+ *.info;mail,authpriv,cron.none                /var/log/messages
- #cron.*                          /var/log/cron.log
+ cron.*                          /var/log/cron.log

+ *.*                             /var/log/all.log

# systemctl restart rsyslog

Logrotateの設定変更(日次、28世代、1世代遅れで圧縮、postfixに日付)

# vi /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
/var/log/messages
/var/log/all.log
/var/log/console.log
{
        rotate 28
        daily
        dateext
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

# vi /etc/logrotate.d/ufw
/var/log/ufw.log
{
        rotate 28
        daily
        dateext
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                [ -x /usr/lib/rsyslog/rsyslog-rotate ] && /usr/lib/rsyslog/rsyslog-rotate || true
        endscript
}

motdの更新スクリプトを作る

Ubuntuの場合は /etc/update-motd.d 以下に実行スクリプトを配置するとファイル名順に実行される

# apt install figlet
# vi /usr/local/bin/ai-stack-motd.sh
#!/bin/bash

# 文字色
#echo -e "\e[30m黒色"
#echo -e "\e[31m赤色"
#echo -e "\e[32m緑色"
#echo -e "\e[33m黄色"
#echo -e "\e[34m青色"
#echo -e "\e[35m赤紫色(マゼンタ)"
#echo -e "\e[36m水色(シアン)"
#echo -e "\e[37m白色"
#echo -e "\e[mリセット"

FONT=standard
HOSTNAME=`hostname`
ETHDEV1='eno8403'
IP_ADDR1=`ip -f inet -o addr show $ETHDEV1|cut -d\  -f 7 | cut -d/ -f 1`
#ETHDEV2='eno8403'
#IP_ADDR2=`ip -f inet -o addr show $ETHDEV2|cut -d\  -f 7 | cut -d/ -f 1`

source /etc/os-release

echo -e "\e[36m$(figlet -f $FONT Ai)\e[m"
echo -e "\e[36m$(figlet -f $FONT Stack)\e[m"

echo -e "\e[35mos\t$NAME $VERSION\e[m"
echo -e "\e[35mhost\t$HOSTNAME\e[m"
echo -e "\e[35m$ETHDEV1\t$IP_ADDR1\e[m"
#echo -e "\e[35m$ETHDEV2\t$IP_ADDR2\e[m"

# chmod a+x /usr/local/bin/ai-stack-motd.sh
# ln -s /usr/local/bin/ai-stack-motd.sh /etc/update-motd.d/01-ai-stack-motd
# chmod a-x /etc/update-motd.d/{10-help-text,50-motd-news}

# vi /etc/cron.daily/000-hostname
#!/bin/sh

figlet -c -w 72 aitest

# chmod a+x /etc/cron.daily/000-hostname

Postfixのインストール

# apt install postfix mailutils
# cp /usr/share/postfix/main.cf.dist /etc/postfix/main.cf
# vi /etc/postfix/main.cf
-#mail_owner = postfix
+mail_owner = postfix

 #myhostname = host.domain.tld
 #myhostname = virtual.domain.tld
+myhostname =  aitest.ai-stack.jp

 #mydomain = domain.tld
+mydomain = aitest.ai-stack.jp

 #myorigin = /etc/mailname
 #myorigin = $myhostname
-#myorigin = $mydomain
+myorigin = $mydomain

-#inet_interfaces = all
+inet_interfaces = all
 #inet_interfaces = $myhostname
 #inet_interfaces = $myhostname, localhost

 #mydestination = $myhostname, localhost.$mydomain, localhost
-#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
+mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
 #      mail.$mydomain, www.$mydomain, ftp.$mydomain

-#local_recipient_maps = unix:passwd.byname $alias_maps
+local_recipient_maps = unix:passwd.byname $alias_maps
 #local_recipient_maps = proxy:unix:passwd.byname $alias_maps
 #local_recipient_maps =

 #mynetworks_style = class
-#mynetworks_style = subnet
+mynetworks_style = subnet
 #mynetworks_style = host

 #alias_maps = dbm:/etc/aliases
-#alias_maps = hash:/etc/aliases
+alias_maps = hash:/etc/aliases
 #alias_maps = hash:/etc/aliases, nis:mail.aliases
 #alias_maps = netinfo:/aliases

 #alias_database = dbm:/etc/aliases
 #alias_database = dbm:/etc/mail/aliases
-#alias_database = hash:/etc/aliases
+alias_database = hash:/etc/aliases
 #alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases

 #home_mailbox = Mailbox
-#home_mailbox = Maildir/
+home_mailbox = Maildir/

 #smtpd_banner = $myhostname ESMTP $mail_name
 #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
-smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
+#smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
+smtpd_banner = $myhostname ESMTP

-sendmail_path =
+sendmail_path = /usr/sbin/postfix

-newaliases_path =
+newaliases_path = /usr/bin/newaliases

-mailq_path =
+mailq_path = /usr/bin/mailq

-setgid_group =
+setgid_group = postdrop

-html_directory =
+#html_directory =

-manpage_directory =
+#manpage_directory =

-sample_directory =
+#sample_directory =

-readme_directory =
+#readme_directory =
+
 inet_protocols = ipv4

# systemctl enable postfix
# systemctl start postfix

# vi /etc/aliases
> root: server@ai-stack.jp
# newaliases
# mail root

ai-stack ユーザのshellをzshに変更

# chsh -s /usr/bin/zsh ai-stack

aptのアップデートチェック

# vi /etc/cron.daily/001-apt_upgradable
#!/bin/sh

apt update && apt list --upgradable

# chmod a+x /etc/cron.daily/001-apt_upgradable

初期設定後のdf状態

root@aitest:~# df -h -T
Filesystem     Type      Size  Used Avail Use% Mounted on
tmpfs          tmpfs      13G  2.2M   13G   1% /run
efivarfs       efivarfs  304K  114K  185K  39% /sys/firmware/efi/efivars
/dev/sda2      xfs       893G   29G  865G   4% /
tmpfs          tmpfs      63G     0   63G   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
/dev/sda1      vfat      1.1G  6.2M  1.1G   1% /boot/efi
tmpfs          tmpfs      13G   12K   13G   1% /run/user/1000

nVIDIAドライバのインストール

# apt install python3-pip

# cd /usr/local/src/
# wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
# dpkg -i cuda-keyring_1.1-1_all.deb
# apt update
# apt install nvidia-driver-580
→エラーでインストールできない...
→ビルドに必要なパッケージが足りていない模様

# apt install build-essential

# apt install nvidia-driver-580
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
nvidia-driver-580 is already the newest version (580.95.05-0ubuntu1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
→インストール済みの表示になったので、上記の build-essential のインストールと同時に途中だったドライバ関係もインストールされた.

# apt install cuda-toolkit-13-0
# nvidia-smi
Thu Nov  6 16:46:22 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA L40S                    Off |   00000000:B5:00.0 Off |                    0 |
| N/A   35C    P0             83W /  350W |       0MiB /  46068MiB |      2%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

以上でUbuntuサーバーのセットアップが完了しました。
次回はHuggingFaceからモデルをロードして、LLMを動かします。

コメント

タイトルとURLをコピーしました