|
@@ -0,0 +1,424 @@
|
|
|
+{
|
|
|
+ "cells": [
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "4719bc46",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "# 必要な準備を行う\n",
|
|
|
+ "\n",
|
|
|
+ "実験中のワークフロー実行のために必要な準備を行います。 \n",
|
|
|
+ "上から順番に実行してください。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "87401770",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 1. Git管理対象外ファイルを.gitignoreで設定する"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "f2cc773c",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "%%sh\n",
|
|
|
+ "cd ~/\n",
|
|
|
+ "echo \"\n",
|
|
|
+ "/.cache/\n",
|
|
|
+ "/.conda/\n",
|
|
|
+ "/.config/\n",
|
|
|
+ "/.ipython/\n",
|
|
|
+ "/.local/\n",
|
|
|
+ "/.tmp/\n",
|
|
|
+ "/.bashrc\n",
|
|
|
+ "/.bash_logout\n",
|
|
|
+ "/.profile\n",
|
|
|
+ "/.netrc\n",
|
|
|
+ ".ipynb_checkpoints/\n",
|
|
|
+ ".fonts/\n",
|
|
|
+ ".jupyter/\n",
|
|
|
+ ".npm/\n",
|
|
|
+ ".ssh/\n",
|
|
|
+ ".jupyter-server-log.txt\n",
|
|
|
+ "\" > ~/.gitignore"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "05ec67b8",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 2. READMEに実験実行環境へのリンクを追加する"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "2eb51aba",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "import os\n",
|
|
|
+ "%cd ~/\n",
|
|
|
+ "with open('README.md', 'a', newline='\\n') as f:\n",
|
|
|
+ " f.write(\"\\n## 実験実行環境にアクセスしたい場合\\n以下のリンクをクリックしてください<br>https://jupyter.cs.rcos.nii.ac.jp\" + os.environ[\"JUPYTERHUB_SERVICE_PREFIX\"] + \"notebooks/experiment.ipynb\")"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "dd0a038d",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 3. ユーザー認証を行う\n",
|
|
|
+ "\n",
|
|
|
+ "この手順では、あなたのユーザ情報をシステムに認証させる手続きを行います。 \n",
|
|
|
+ "以下のセルを実行行し、画面の表示に沿ってデータガバナンス機能に登録したユーザー名、パスワード、メールアドレスを入力してください。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "bf28557d",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "%cd ~/WORKFLOW/scripts\n",
|
|
|
+ "import json\n",
|
|
|
+ "from scripts import utils\n",
|
|
|
+ "\n",
|
|
|
+ "# 以下の認証の手順で用いる、\n",
|
|
|
+ "# GINのドメイン名等をパラメタファイルから取得する\n",
|
|
|
+ "params = {}\n",
|
|
|
+ "with open(utils.fetch_param_file_path(), mode='r') as f:\n",
|
|
|
+ " params = json.load(f)"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "61c68c98",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "import os\n",
|
|
|
+ "import time\n",
|
|
|
+ "import getpass\n",
|
|
|
+ "import requests\n",
|
|
|
+ "\n",
|
|
|
+ "from IPython.display import clear_output\n",
|
|
|
+ "from requests.auth import HTTPBasicAuth\n",
|
|
|
+ "from http import HTTPStatus\n",
|
|
|
+ "\n",
|
|
|
+ "# 正常に認証が終わるまで繰り返し\n",
|
|
|
+ "while True:\n",
|
|
|
+ " name = input(\"ユーザー名:\")\n",
|
|
|
+ " password = getpass.getpass(\"パスワード:\")\n",
|
|
|
+ " email = input(\"メールアドレス:\")\n",
|
|
|
+ " clear_output()\n",
|
|
|
+ " \n",
|
|
|
+ " # GIN API Basic Authentication\n",
|
|
|
+ " # refs: https://docs.python-requests.org/en/master/user/authentication/\n",
|
|
|
+ " \n",
|
|
|
+ " # 既存のトークンがあるか確認する\n",
|
|
|
+ " response = requests.get(params['siblings']['ginHttp']+'api/v1/users/' + name + '/tokens', auth=(name, password))\n",
|
|
|
+ " tokens = response.json()\n",
|
|
|
+ "\n",
|
|
|
+ " # 既存のトークンがなければ作成する\n",
|
|
|
+ " if len(tokens) < 1:\n",
|
|
|
+ " response = requests.post(params['siblings']['ginHttp']+'api/v1/users/' + name + '/tokens', data={\"name\": \"system-generated\"} ,auth=(name, password))\n",
|
|
|
+ "\n",
|
|
|
+ " if response.status_code == HTTPStatus.OK or HTTPStatus.CREATED:\n",
|
|
|
+ " tokens = response.json()\n",
|
|
|
+ " clear_output()\n",
|
|
|
+ " print(\"認証が正常に完了しました。次の手順へお進みください。\")\n",
|
|
|
+ " break\n",
|
|
|
+ " else:\n",
|
|
|
+ " clear_output()\n",
|
|
|
+ " print(\"ユーザ名、またはパスワードが間違っています。\\n恐れ入りますがもう一度ご入力ください。\")\n",
|
|
|
+ "\n",
|
|
|
+ "!git config --global user.name $name\n",
|
|
|
+ "!git config --global user.email $email"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "fce82ba7",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 4. データ同期のための設定をする\n",
|
|
|
+ "\n",
|
|
|
+ "この手順では、今の実行環境とデータガバナンス機能のリポジトリでデータの同期をとるための準備をします。 \n",
|
|
|
+ "以下を実行することで、システムがデータ同期の準備の手続きを行います。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "e277f2c2",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "%%bash\n",
|
|
|
+ "#!/bin/bash\n",
|
|
|
+ "if [ ! -e ~/.ssh/id_ed25519 ]; then\n",
|
|
|
+ " # 鍵ペアが無ければ作成\n",
|
|
|
+ " ssh-keygen -t ed25519 -N \"\" -f ~/.ssh/id_ed25519\n",
|
|
|
+ "fi\n",
|
|
|
+ "\n",
|
|
|
+ "# dataset化されなかったので下のセルに暫定的に修正\n",
|
|
|
+ "#if [ ! -d ~/.datalad/ ]; then\n",
|
|
|
+ " # Dataladのデータセットでなければデータセット化する\n",
|
|
|
+ "# datalad create --force /home/jovyan\n",
|
|
|
+ "#fi"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "03dc3f22",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "%cd ~/\n",
|
|
|
+ "!datalad create --force ."
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "8181ce0f",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "# 公開鍵アップロード\n",
|
|
|
+ "# refs: https://github.com/gogs/docs-api/blob/master/Users/Public%20Keys.md#create-a-public-key\n",
|
|
|
+ "import os\n",
|
|
|
+ "import requests\n",
|
|
|
+ "import time\n",
|
|
|
+ "from http import HTTPStatus\n",
|
|
|
+ "\n",
|
|
|
+ "import json\n",
|
|
|
+ "from scripts import utils\n",
|
|
|
+ "\n",
|
|
|
+ "pubkey = !cat ~/.ssh/id_ed25519.pub\n",
|
|
|
+ "\n",
|
|
|
+ "# 認証時に取得したトークンを使ってPOSTリクエスト\n",
|
|
|
+ "response = requests.post(\n",
|
|
|
+ " params['siblings']['ginHttp']+'api/v1/user/keys?token=' + tokens[0]['sha1'],\n",
|
|
|
+ " data={\n",
|
|
|
+ " \"title\": \"system-generated-\"+str(time.time()),\n",
|
|
|
+ " \"key\": pubkey[0]\n",
|
|
|
+ " })\n",
|
|
|
+ "msg = response.json()\n",
|
|
|
+ "\n",
|
|
|
+ "# コンテナを消す際にコンテナとつなぐための公開鍵も削除のため、\n",
|
|
|
+ "# パラメータとしてGINから発行された鍵IDを保存\n",
|
|
|
+ "if response.status_code == HTTPStatus.CREATED:\n",
|
|
|
+ " # params.jsonへの追記(鍵ID)\n",
|
|
|
+ " params['ginKeyId'] = str(response.json()['id'])\n",
|
|
|
+ " with open(utils.fetch_param_file_path(), mode='w') as f:\n",
|
|
|
+ " json.dump(params, f, indent=4)\n",
|
|
|
+ " print('Public key is ready.')\n",
|
|
|
+ "elif msg['message'] == 'Key content has been used as non-deploy key':\n",
|
|
|
+ " print('Public key is ready before time.')"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "13f1918f",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "# sibling url をsshに変更する\n",
|
|
|
+ "import os\n",
|
|
|
+ "import tempfile\n",
|
|
|
+ "from datalad import api\n",
|
|
|
+ "from IPython.display import clear_output\n",
|
|
|
+ "\n",
|
|
|
+ "remote_info = 'remote.txt'\n",
|
|
|
+ "\n",
|
|
|
+ "with tempfile.TemporaryDirectory() as tmpdir:\n",
|
|
|
+ " # 使い終わったらPython側で消してくれるTemporaryDirectoryを利用\n",
|
|
|
+ " # refs: https://qiita.com/everylittle/items/aa7c6f612ff0a9db7f01\n",
|
|
|
+ " tmppath = os.path.join(tmpdir, remote_info)\n",
|
|
|
+ " !git remote show origin > $tmppath\n",
|
|
|
+ " with open(tmppath, 'r') as f:\n",
|
|
|
+ " lines = [s.strip() for s in f.readlines()]\n",
|
|
|
+ " \n",
|
|
|
+ " # FIXME: GitHub等リポジトリにも対応するためハードコーディングを解消\n",
|
|
|
+ " ssh_push_url = lines[2].replace('Push URL: http://dg02.dg.rcos.nii.ac.jp/', 'ssh://root@dg02.dg.rcos.nii.ac.jp:3001/') \n",
|
|
|
+ "\n",
|
|
|
+ "api.siblings(action='add', name='gin', url=ssh_push_url)\n",
|
|
|
+ "clear_output()\n",
|
|
|
+ "print('SSH connection is ready.')"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "4bd90923",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 5. 高性能実験環境利用のために必要な設定をする\n",
|
|
|
+ "\n",
|
|
|
+ "高性能実験環境を利用している場合には、以降のセルを実行してください。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "c13e1f3c",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "### 5.1 アカウント情報の入力\n",
|
|
|
+ "\n",
|
|
|
+ "以下のセルを実行し、表示されるフォームにアカウント情報を入力してください。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "652fbc4a",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "from IPython.display import clear_output\n",
|
|
|
+ "import getpass\n",
|
|
|
+ "name_mdx = input(\"高性能実験環境におけるSSHユーザ名:\")\n",
|
|
|
+ "clear_output()"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "eebec153",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "### 5.2. SSH秘密鍵の設置\n",
|
|
|
+ "\n",
|
|
|
+ "左上のバナーを押下し、ファイル一覧画面に遷移してください。 \n",
|
|
|
+ "遷移後、id_rsaファイルをドラッグアンドドロップによりアップロードしてください。 \n",
|
|
|
+ "アップロード後、以下のセルを実行してください。"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "2b3c02b6",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "!mkdir -p /home/jovyan/.ssh/\n",
|
|
|
+ "!mv ~/id_rsa ~/.ssh/\n",
|
|
|
+ "!chmod 600 ~/.ssh/id_rsa\n",
|
|
|
+ "\n",
|
|
|
+ "with open(\"/home/jovyan/.ssh/config\", \"a\") as f:\n",
|
|
|
+ " f.write(\"Host mdx\\n\")\n",
|
|
|
+ " f.write(\" Hostname 163.220.176.51\\n\")\n",
|
|
|
+ " f.write(\" User \" + name_mdx + \"\\n\")\n",
|
|
|
+ " f.write(\" Port 22\\n\")\n",
|
|
|
+ " f.write(\" IdentityFile ~/.ssh/id_rsa\\n\")\n",
|
|
|
+ " f.write(\" StrictHostKeyChecking no\\n\")"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "0cf0dff5",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "### 5.3. 実験活動のためのディレクトリ初期化"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "078c6bc2",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "import os\n",
|
|
|
+ "tmp = os.environ[\"BINDER_REF_URL\"]\n",
|
|
|
+ "tmp = tmp.split(\"/\")\n",
|
|
|
+ "tmp = tmp[len(tmp) - 1]\n",
|
|
|
+ "repo_name = tmp[:tmp.find(\".\")]\n",
|
|
|
+ "\n",
|
|
|
+ "cmd = \"mkdir ./\" + repo_name + \"/\"\n",
|
|
|
+ "!ssh mdx $cmd\n",
|
|
|
+ "\n",
|
|
|
+ "!scp -r ~/input_data/ mdx:~/$repo_name/input_data\n",
|
|
|
+ "!scp -r ~/output_data/ mdx:~/$repo_name/output_data\n",
|
|
|
+ "!scp -r ~/source/ mdx:~/$repo_name/source"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "markdown",
|
|
|
+ "id": "ed3fb5e4",
|
|
|
+ "metadata": {},
|
|
|
+ "source": [
|
|
|
+ "## 6. 実行結果を実験リポジトリに同期する"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "d12d4375",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "from IPython.display import display, Javascript\n",
|
|
|
+ "display(Javascript('IPython.notebook.save_checkpoint();'))"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "7b237228",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "# SSHホスト(=GIN)を信頼する設定\n",
|
|
|
+ "# ドメイン名がハードコーディングにつき要修正\n",
|
|
|
+ "with open('/home/jovyan/.ssh/config', mode='w') as f:\n",
|
|
|
+ " f.write('host dg02.dg.rcos.nii.ac.jp\\n\\tStrictHostKeyChecking no\\n\\tUserKnownHostsFile=/dev/null\\n')"
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "cell_type": "code",
|
|
|
+ "execution_count": null,
|
|
|
+ "id": "daa0c2cd",
|
|
|
+ "metadata": {},
|
|
|
+ "outputs": [],
|
|
|
+ "source": [
|
|
|
+ "#FIXME:papermill実装に修正する。TO_GIT=true\n",
|
|
|
+ "%cd ~/\n",
|
|
|
+ "!git add .\n",
|
|
|
+ "!git commit -m \"prepare_for_workflow\"\n",
|
|
|
+ "!git push gin master"
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "metadata": {
|
|
|
+ "kernelspec": {
|
|
|
+ "display_name": "Python 3 (ipykernel)",
|
|
|
+ "language": "python",
|
|
|
+ "name": "python3"
|
|
|
+ },
|
|
|
+ "language_info": {
|
|
|
+ "codemirror_mode": {
|
|
|
+ "name": "ipython",
|
|
|
+ "version": 3
|
|
|
+ },
|
|
|
+ "file_extension": ".py",
|
|
|
+ "mimetype": "text/x-python",
|
|
|
+ "name": "python",
|
|
|
+ "nbconvert_exporter": "python",
|
|
|
+ "pygments_lexer": "ipython3",
|
|
|
+ "version": "3.7.10"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "nbformat": 4,
|
|
|
+ "nbformat_minor": 5
|
|
|
+}
|