Mac miniで始める「計算機サーバー」入門!

はじめまして、データサイエンティストのますみです!

機械学習や画像処理などの計算負荷の高い処理(いわゆる重い処理)に対して、「並列処理」や「長時間の計算処理」などを行いたい方々が多いと思います。自前のラップトップでは、長時間の稼働をすることが難しかったり、スペックが低かったりして、運用は難しいと思います。一方、計算機サーバーを一度構築すれば、並列処理を行う際にコンピュータのリソースを集中的に配分できたり、複数日に渡る処理を実行できたりします。

本来、Ubuntu、CentOS、WindowsOSなどを用いた方法が主流ですが、この記事では手軽な構築を目的としてMac ProやMac miniなどに入っているmacOSを用いて、初心者でも簡単にサーバーを構築する方法についてご紹介します。

Mac mini以外でも大丈夫!
macOSであれば、Mac mini以外のコンピュータでも大丈夫です。昔使っていた古いMac Bookなどを計算機サーバーとして再利用するのもありなので、ぜひ挑戦してみてください。

また、サーバー構築の話と深く関わる「ネットワークセキュリティ」の対策方法についてもまとめていきます。しかし、完璧なセキュリティやハードウェアの安全性を保証していないことだけご了承ください。

1. 前提知識

はじめに前提知識についていくつか説明していきます。すでにご存知の方は飛ばしていただいても大丈夫です。

1-a. サーバーとは

サーバー(サーバ、Server、鯖)とは、「サービスを提供するためのソフトウェア」あるいは「そのサービスを提供しているコンピュータ」です。ソフトウェアとは、コンピュータを動かすためのプログラム(命令文)になります。

なので、「計算機サーバー」とは自前のコンピュータの代わりに「計算処理を行ってくれるサービスを提供してくれるコンピュータ」になります。ここでは、自宅・会社・研究室での計算機サーバーの構築方法を紹介するため、サービスとい感じではありませんが、サーバーとは本来こういった意味を持ちます。

1-b. Mac miniとは

Mac miniとは、Appleが提供している小型コンピュータです。スペックが低いと思われがちですが、実は全然低くはありません。

最安価の場合:3.6GHz 4コア(i3)、メモリ8GB、ストレージ256GB(SSD)
課金した場合:3.2GHz 6コア(i7)、メモリ64GB、ストレージ2TB(SSD)

また、自宅や研究室や会社で場所をあまり取らない上、Mac Proに比べたら安価なため、サクッと計算機サーバーを立てたい時にはぴったりだと個人的には思います。

参考 Apple Mac miniAmazon

Mac mini 紹介ページ

2. 計算機サーバーのメリットとデメリット

この章では、計算機サーバーのメリットとデメリットをまとめたいと思います。人それぞれ、コンピュータによって実現したいことは異なるため、自分にあったシステムを選択しましょう。

コンピュータの形態概要メリットデメリット
ラップトップ持ち運びできるコンピュータ(Surface、Mac Bookなど)。・持ち運び ◎・長時間の稼働 ×
・スペック △
デスクトップ家や会社や研究室などに固定で置いているコンピュータ(Mac mini、iMac、Mac Proなど)。
ディスプレイやキーボードなどの外部機器と接続することが多い。
・スペック ◯
・長時間の稼働 ◯
・持ち運び ×
・固定場所を取る
(ディスプレイやキーボードなどの外部機器があるため)
計算機特化型自前でCPUやGPUを買い揃えて、構築することが多い。
デスクトップコンピュータを特化型として用いることも可能。
・スペック ◎
・長時間の稼働 ◎
・リソースのフル活用◎
(余計なアプリケーションを起動しないため)
・固定場所をあまり取らない
(LANケーブルを繋ぐだけで良いため)
・持ち運び ×
・専門知識が必要
・保守 / 運用が必要

3. 計算機サーバーの作り方 〜ネットワーク編〜

【サーバーへのアクセス方法まとめ】

はじめに、サーバーへのアクセス方法についてまとめておきます。

アクセス方法概要メリットデメリット
SSHによるリモートログインコマンドラインで処理を実行。・実行までが速い
・余計なリソースを使わない
・複数ユーザーによるアクセス ◎
・CUIを使える人に限定
・同一ネットワーク内からのみアクセス可能
VNCによる画面共有Macの画面共有機能を用いて、GUI操作。・GUI操作可能
・複数ユーザーによるアクセス ◎
・余計なメモリを消費
・同一ネットワーク内からのみアクセス可能
Google Remote DesktopによるリモートアクセスGoogleのリモートアクセス機能を用いて、GUI操作。・GUI操作可能
・どこからでもアクセス可能
・複数ユーザーによるアクセス△
・余計なメモリを消費

CUIとGUIとは?
CUI(Character User Interface)は「コマンドを使って操作する手法」です。処理の自動化や共有がしやすいことが利点としてあります。

一方、GUI(Graphical User Interface)は「ボタンのクリックやドラッグなどを使って操作する手法」です。多くの人が初めてでも使いやすいという利点があります。

3-a. SSHによるリモートログイン

SSHとは?

まず、SSH(Secure Shell)とは、安全にリモートアクセスをするためのプロトコルです。Telnetやrsh(remote shell)などを用いると、セキュリティ面で不適切なため、SSHを用いることが推奨されます。

プロトコルとは?
プロトコル(Protocol)とは、あらかじめ決められた規約のことです。主に、通信プロトコルのことを指していて、「情報通信する時はこういうルールで送受信しようね」というお約束事です。
【IT用語辞典より】

SSHによるアクセス方法

まずは、サーバー側(Mac mini)のPCで「共有 / Sharing」を選択します。

次に、「リモートログイン / Remote Login」にチェックします。

すると、「masumi_morishige@192.168.0.10」というようなSSHへアクセスするためのリンクが表示されます。

次に、クライアント側(MacBook Proなど)のPCから以下のようにアクセスします。

Fingerprintについて

Fingerprintとは、日本語で指紋という意味です。初めてSSHでアクセスする場合は、Fingerprintを保存するか聞かれますが、その時はyで保存しましょう。

また、Fingerprintの情報は、~/.ssh/known_hostsに保存されているようです。

ssh_login.txt
masumi_morishige@Masumi-MacBook-Pro ~ % ssh masumi_morishige@192.168.0.10
Password:
Last login: Fri Oct 16 00:35:31 2020 from 192.168.0.8
masumi_morishige@Mac-Mini ~ %

%$の手前に表示されるコンピュータ名が変わったら、接続成功です!
私の場合は、Masumi-MacBook-Pro(クライアント)からMac-Mini(サーバー)へアクセスできていることがわかります。

最後に、SSHが通っていることを確認するために、sample.pyというファイルをDesktopに作成してみましょう。

ssh_test.txt
masumi_morishige@Mac-Mini ~ % echo "print('Hello World.')" >> ~/Desktop/sample.py
masumi_morishige@Mac-Mini ~ % ls ~/Desktop/
sample.py

3-b. VNCによる画面共有

VNCとは?

VNC(Virtual Network Computing)とは、コンピュータを遠隔操作する時に用いるソフトウェアです。RFB(Remote FrameBuffer)プロトコルというフレームバッファーを用いた通信手段を使っています。

VNCによるアクセス方法

まずは、サーバー側(Mac mini)のPCで「共有 / Sharing」を選択します。

そして、「画面共有 / Screen Sharing」にチェックすると、「vnc://192.168.0.10」というようなVNCに接続するURLが表示されます。

次に、クライアント側(MacBook Proなど)のPCで以下のように、Webブラウザを開き、先ほどサーバー側で表示されていたVNCのリンク「vnc://192.168.0.10」を開きます。

すると、以下のようなダイアログが出てくるため、「Open Screen Sharing app」の方を選択します。

最後に、以下のようにサーバー側のアカウントでサインインしましょう。

すると、以下のようにサーバー側の画面が表示され、そこで遠隔操作ができるようになります。

Connection failed to xxx

以下のようにConnection failed to xxxというようなエラーが出てくる時があります。以下の例では、129.168.0.10という誤ったアドレスへアクセスしています。

以下の例は、クライアント側のエラーですが、サーバー側のエラーで生じることがあります。そういう時は、サーバー側のファイアウォールを確認しましょう。

3-c. Google Remote Desktopによるリモートアクセス

Google Remote Desktopとは?

Google Remote Desktopとは、Googleが出しているリモートアクセスサービスです。外出先や自宅などのどこからでも特定のコンピュータにアクセスすることができます。他にもTeamViewerやAnyDeskなどのサービスがあります。

Google Remote Desktopによるアクセス方法

まず、サーバー側のコンピュータでGoogle Remote Desktopにアクセスして、「Get Started」などのボタンをクリックします。

すると、Googleのログイン画面が出てくるため、ログインします。

すると、以下のようにダウンロードボタンが出てくるため、クリックして、ダウンロードを進めましょう。

ダウンロードが終わると、以下のように「オンにする」というようなリモートアクセスを許可するためのボタンが現れるため、そこを選択します。

サーバーの名前を入力して、「次へ」をクリックします。

最後に、PINを設定して、「起動」をクリックします。

アクセス許可に関するダイアログ が出てくるため、こちらは許可しましょう。

以下のように「起動しています…」の後にしばらくして再読み込みをして、「オンライン」になれば、設定完了です。

次に、クライアント側から同様の方法でGoogle Remote Desktopにアクセスをしてみましょう。すると、以下のように登録したサーバーが現れます。

そこをクリックして、登録したPINでログインします。

すると、以下のようにサーバー側の画面を操作することができます。

文字が読みづらい時のTips

コンピュータのディスプレイの解像度があまりにも違うと、文字が大きくなりすぎたり、小さくなりすぎたりすることがあります。そういう時は、以下のように「ウィンドウに合わせてサイズ変更」のチェックを外しましょう。

4. 計算機サーバーの作り方 〜セキュリティ編〜

4-a. ユーザー認証

まず代表的な認証方法として、ユーザー認証があります。これは、おそらく一番皆さんの馴染みがあるもので、「ユーザー名」と「パスワード」の組み合わせで認証するセキュリティ方式です。

こちらは、今回紹介した3つのアクセス方式の全てに実装されています。

Google Remote Desktopでは、「Googleアカウントのユーザー認証 + PIN認証」という形の2段階認証を採用しています。

4-b. ホスト認証

次に、ホスト認証があります。これは、アクセス元のコンピュータを限定する方法です。SSHとVNCにおいては、同じネットワーク内に接続しているコンピュータからしかアクセスできないため、ホスト認証を採用していると考えていいでしょう。

また、「IPアドレスによるホスト認証」を行うことも可能です。

4-c. 公開鍵認証

公開鍵認証とは

簡単に言うと、「鍵穴(公開鍵)をサーバー側に用意して、鍵(秘密鍵)をクライアント側で保持することで認証する方法」です。公開鍵認証を採用することにより、秘密鍵を持ったコンピュータからしかアクセスすることができなくなり、セキュリティレベルがユーザー認証などに比べて上がります。

一方で、鍵の管理に手間がかかるという欠点を持っています。

また、ファイル構成としては、一般的に秘密鍵はid_rsa公開鍵はid_rsa.pubというファイル名で生成されます。

① 公開鍵認証の設定方法【クライアント側】

まずは、クライアント側で鍵の生成を行います。

ここからの設定は基本的に~/.sshというディレクトリで行っていきます。もしもこのフォルダがない場合は、mkdir ~/.sshで生成しましょう。

まず、フォルダに対して権限を付与してから、そのディレクトリへ移動しましょう。

key_gen_prep.sh
% mkdir ~/.ssh
% chmod 700 ~/.ssh
% cd ~/.ssh

続いて、鍵の生成を行いましょう。パスフレーズ(Passphrase)は、次の章でも説明しますが、鍵にかける鍵のようなものになります。こちらは設定しなくても生成できますが、設定することを推奨します。

key_gen_execute.sh
% ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/masumi_morishige/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/masumi_morishige/.ssh/id_rsa.
Your public key has been saved in /Users/masumi_morishige/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:faho84hfhejrrfhadjfnw3i3-24ghihenfweuhfow masumi_morishige@Masumi-MacBook-Pro.local
The key's randomart image is:
+---[RSA 4096]----+
|.      @  @      |
|.x  x  F     B   |
|-.gb  x - - .    |
| -.  + B + = o   |
| .    + B + .    |
|    . S . .      |
|  .  + B +       |
| -    = * +      |
| @  *   o     o =|
+----[SHA256]-----+

次に、生成されたid_rsa(秘密鍵)id_rsa.pub(公開鍵)の内、秘密鍵の方をクライアント側に残し、公開鍵をサーバー側へ移します。

鍵があることを確認した後、以下のようにしてペーストボードへ鍵の文字列をコピーしましょう。

show_key.sh
% ls
id_rsa  id_rsa.pub  known_hosts
% cat id_rsa.pub | pbcopy

RSAとは

本記事では、RSA(Rivest Shamir Adleman)を採用しています。一方で、RSAは素因数分解の計算量の多さを利用した暗号化手法です。

【参考:RSA暗号とは?仕組みや応用事例を初心者にもわかりやすく解説!】

-b 4096とは

ssh-keygenのオプションとして、-b 4096を付与していますが、これは4096 bitsの暗号化を行うという指定になります。従来の2048 bitsだと脆弱性が生まれてしまうことがあるため、こちらの方がセキュアな鍵になります。

SHAとは

SHA(Secure Hash Algorithm) は、ハッシュ関数を用いた暗号化手法で、どんな原文に対しても暗号化を行うことができます。SHA-256の場合は、256bitのハッシュへ変換するということになります。

【参考:5分でわかるSSL通信 SHA-1、SHA-2の違いとは?】

② 公開鍵認証の設定方法【サーバー側】

続いて、サーバー側のコンピュータで先ほど作成した公開鍵を登録していきましょう。

まず以下のようにして、~/.sshを作成して、権限付与をして、そのディレクトリへ移動しましょう。

key_register_prep.sh
% mkdir ~/.ssh
% chmod 700 ~/.ssh
% cd ~/.ssh

そこで、以下のようにauthorized_keysというファイルを作成して、ペーストするコマンドを実行しましょう。そして、そのファイルへの権限をchmodで少し制限しましょう。

gen_authorized_keys.sh
% pbpaste >> ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys

③ 公開鍵認証の設定方法【ユーザー認証の解除】

このままだと公開鍵認証は有効になったのですが、ユーザー認証でもアクセスすることができてしまいます。そのため、ユーザー認証の解除を「サーバー側」のコンピュータで行っていきましょう。ここからは、/etc/ssh/sshd_configファイルを編集しています。

まず変更する前に以下のコマンドでバックアップを取得しましょう。
また、パスワードを要求されるため、入力しましょう。

backup.sh
% sudo su
% cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bu_1

続いて、以下のように/etc/ssh/sshd_configPasswordAuthenticationをコメントを外して、noに変更します。

/etc/ssh/sshd_config
===== 省略 =====

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

===== 省略 =====

これで設定は完了したのですが、sshdを再起動する必要があるため、以下のコマンドを実行します。

restart_sshd.sh
% service sshd restart

sshd_configファイルについて

今回編集したsshd_configファイルは少し新鮮なスクリプトファイルだったと思います。基本的にこのファイルはコメントで書かれており、そこにデフォルトの設定が記入されています。そのため、コメントに記載されている設定を変更したい時に、そのコメントを外して編集する形になります。

④ 公開鍵認証の設定方法【公開鍵認証を用いてアクセス】

ここまで道のりは長かったですが、公開鍵認証でアクセスしてみましょう!アクセスの方法としては、秘密鍵(id_rsa)をオプションで指定します。パスフレーズを登録している場合は、パスフレーズの入力を求められると思います。

access_by_pubkey.sh
% ssh -i ~/.ssh/id_rsa masumi_morishige@192.168.0.10

参考 「よく分かる公開鍵認証」~初心者でもよくわかる!VPSによるWebサーバー運用講座(2)サクラナレッジ

参考 お前らのSSH Keysの作り方は間違っているQitta

参考 現在のパスをクリップボードにコピーする小技【Bash】Qitta

4-d. パスフレーズ認証

公開鍵を生成する際に、パスワードを設定することができ、この認証方法のことをパスフレーズ認証と呼びます。鍵にさらに鍵をかけるということですね。

もしもパスフレーズを設定していない場合は、鍵を紛失したり、奪取された時に誰でもサーバーへアクセスできるようになってしまいます。

4-e. ポートの変更

SSHのアクセスには多くの場合、ポート22番を用いることが多いです。そのため、クラッキングされる際もここに対して攻撃されることが想定されます。これを回避し、時間を稼ぐためにポートを変更するような対策を取られることがあります。

4-f. ルートユーザーの除外

万が一、クラッキングされた時に、攻撃者への権限をなるべく押さえ込むために、SSHでルートユーザーへはアクセスできないように設定することを推奨します。

ルートユーザーへのアクセス制限は、「サーバー側」/etc/ssh/sshd_configのファイルで設定することができます。

まず変更する前に以下のコマンドでバックアップを取得しましょう。
また、パスワードを要求されるため、入力しましょう。

backup.sh
% sudo su
% cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bu_2

続いて、以下のように/etc/ssh/sshd_configPermitRootLoginをコメントを外して、noに変更します。

/etc/ssh/sshd_config
===== 省略 =====

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

===== 省略 =====

これで設定は完了したのですが、sshdを再起動する必要があるため、以下のコマンドを実行します。

restart_sshd.sh
% service sshd restart

参考 「サーバーをさわってみよう!」~初心者でもよくわかる!VPSによるWebサーバー構築講座(2)サクラナレッジ

5. その他のTips

5-a. 換気の仕方

少し大掛かりなサーバーの場合ですが、以下のサイトが参考になるかと思います。

参考 コンピュータサーバ室設備設置及び運用のガイドラインTSCP 産学連携研究会

5-b. 稼働率の見方

稼働率は、以下のような二つの方法で確認することがオススメです。

1. アクティビティ・モニタ / Activity Monitor

「アクティビティ・モニタ / Activity Monitor」というアプリケーションを検索して、起動しましょう。起動したら、以下のように「CPU」から「CPU負荷 / CPU Load」をダブルクリックしましょう。

すると、以下のようなCPU負荷のヒストリーが時系列で表示されます。

CPU負荷をDockで表示する方法

以下のようなアプリケーションのアイコンを「Dock」と言います。アクティビティ・モニタのDockアイコンを右クリックして、「Dock Icon > Show CPU History」を選択します。

すると、以下のようにDockにCPU Historyが表示されます。

2. Run Cat

以下のようにApp Storeで、Run Catと検索して、インストールしましょう。

すると、以下のようにCPU / Memory / Disk Storage / Network のアクティビティを可視化することができます。

5-c. Terminal上での並列計算

Bashで処理を回す時、計算処理を回す時に並列処理を用いる時があると思います。このような時は、以下のような2種類の方法で並列処理を行うことができます。

1. &を用いた方法

ここでは、以下に並列処理と直列処理の例を示したいと思います。

並列処理は、以下のように&を1つでつなげることで実行可能です。

parallel.sh
sleep 1 & sleep 2 & sleep 3

直列処理は、以下のように&を2つでつなげることで実行可能です。

serial.sh
sleep 1 && sleep 2 && sleep 3

参考 シェルスクリプトで単純に並列実行・直列実行を行うQiita

2. GNU Parallelを用いた方法

また、brew install parallelでインストールして、以下の手順でGNU Parallelで実行することもできます。

参考 GNU Parallelがすごすぎて生きるのがつらいDISQUS

5-d. macOSでのGPUの解放方法

GPUをMachine Learningに用いる場合は、以下の二つの方法があります。

1. PlaidMLを用いた方法

参考 PlaidML+kerasでDeep Learning環境をつくる:環境整備編SHIMPEI MIURA

2. tensorflow-rocmを用いた方法

参考 AMD社製GPUを用いたTensorFlow環境構築(Tensorflow導入~サンプル動作編)INSTANT TRY

5-e. IPアドレスの固定方法

SSHとVNCは、サーバーのIPアドレスを用いています。そして、サーバーを長期間運用しているとローカルネットワーク内のIPアドレスの再配分が行われるタイミングがあります。それを防ぐために、IPアドレスの固定をすることをお勧めします。

参考 macOS(v10.13以降)のIPアドレス(IPv4)を固定に設定する手順NEC Platforms

6. サーバー管理者向けリンク

この章では、サーバーの管理者がサーバーの使用者に向けて、配布するためのドキュメンテーションを用意しました。

6-a. 鍵の生成とSSHの接続方法

この章のリンクはこちら(https://www.ai-lab.app/256/#6-a_SSH)です。

1. シェルの起動

Windowsの方は「コマンドプロンプト」を、macOSの方は「terminal」のアプリケーションを開きます。

2. 鍵の生成

シェルで以下のようなコマンドを実行しましょう。

key_gen_prep.sh
% mkdir ~/.ssh
% chmod 700 ~/.ssh
% cd ~/.ssh
% ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/masumi_morishige/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/masumi_morishige/.ssh/id_rsa.
Your public key has been saved in /Users/masumi_morishige/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:faho84hfhejrrfhadjfnw3i3-24ghihenfweuhfow masumi_morishige@Masumi-MacBook-Pro.local
The key's randomart image is:
+---[RSA 4096]----+
|.      @  @      |
|.x  x  F     B   |
|-.gb  x - - .    |
| -.  + B + = o   |
| .    + B + .    |
|    . S . .      |
|  .  + B +       |
| -    = * +      |
| @  *   o     o =|
+----[SHA256]-----+

3. 公開鍵の送信

~/.ssh/id_rsa.pubのファイル(公開鍵)をサーバー管理者へ送信し、登録をしてもらいましょう。

4. SSHでの接続

サーバー管理者に登録をしてもらったら、以下のコマンドを実行しましょう。
また、以下のuser@192.168.xx.xxには、サーバー管理者に指示された文字列を入力しましょう。

以下のようにコマンドの先頭が変わったら、接続成功です。

masumi_morishige@user ~ % ssh -i ~/.ssh/id_rsa user@192.168.xx.xx
The authenticity of host '192.168.xx.xx (192.168.xx.xx)' can't be established.
 ECDSA key fingerprint is SHA256:xxx.
 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 Warning: Permanently added '192.168.xx.xx' (ECDSA) to the list of known hosts.
 Enter passphrase for key '/Users/masumi_morishige/.ssh/id_rsa': 
 Last login: Thu Apr 15 17:56:53 2021
user@pc-name ~ % 

最後に

いかがだったでしょうか?
この記事を通して、少しでもあなたの困りごとが解決したら嬉しいです^^

📩 仕事の相談はこちら 📩

お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。
問い合わせフォームはこちら

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。
info*galirage.com(*を@に変えてご送付ください)

🎁 「生成AIの社内ガイドライン」PDFを『公式LINE』で配布中 🎁
「LINEで相談したい方」や「お問い合わせを検討中の方」は、公式LINEでご連絡いただけますと幸いです。
(期間限定で配信中なため、ご興味ある方は、今のうちに受け取りいただけたらと思います^^)
公式LINEはこちら

🚀 新サービス開始のお知らせ 🚀

新サービス 「AI Newsletter for Biz」 がスタートしました!

ビジネスパーソン向けに「AIニュース」を定期配信する完全無料のニュースレターです📩

ますみが代表を務める「株式会社Galirage」では、「生成AIを用いたシステムの受託開発(アドバイス活動含む)」をしています。

そこでお世話になっているお客様に対して、「最新トレンドを加味したベストな提案」をするために、日々最新ニュースを収集する仕組みを構築していました。

今回は、そこで構築した仕組みを活用して、より多くの人に有益な情報を届けたいと思い、本サービスを開始しました!

一人でも多くの方にとって、「AI人材としてのスキルアップ」につながれば幸いです^^

▼ 登録はこちらから ▼
https://bit.ly/ai_newsletter_for_biz_ai_lab

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA