重なり合う領域も許容する NER 特化のアノテーションツールを作った
- はじめに
- 画面構成
- すぐ試す方法
- 自前データの import
- おわりに
はじめに
どうもお久しぶりです。みなさん、アノテーションしてますか?私はしてます。2026年時点で、AIの性能は凄まじく、機械学習の実装部分は一瞬で完了するようになりました。一方で、機械学習の性能を左右するアノテーションの部分は、まだまだ人力で泥臭くやる部分が多く、人間はAIにデータを提供する奴隷のような状態が続いています。(「です」「ます」を打つのが面倒なので、ここからは常体で書きます。)
NERという自然言語のタスクをご存知だろうか? NERは、文字列の領域に対して、特定のラベルを付与するタスクである。例えば、医療文書であれば、疾患名や薬剤名などのラベルを付与する。こういった文字列アノテーションは、データ構造もある程度複雑になるので、スプレッドシートなどの単純なツールでアノテーションすることは困難で、多くの場合は専用のアノテーションツールを使うことになる。
特に有名なのが Label Studio ではないかと思う。ほかにも色々ツールはあるがどれも似たようなものだ。これらのツールを使ってアノテーション作業をすることも可能なのだが、共通する問題点があると感じた。
- 複数のラベルを重複した領域に付与したい
- あるラベルの定義を見ながら作業したい
- あるラベルのついた他の例を見ながら作業したい
- 同じ表層(スパンの文字列)が、別文章ではどう扱われているかを見ながら作業したい
- (LLMで半自動アノテーションしたい)
特に最初の、領域重複のアノテーションに対応してるツールは存在しないといっても良い(一般的なNERは重複を許容しないからそそれが合理的ではあるんだが)。もしくはデータ構造上、領域重複が可能でも既存のアノテーションツールの可視化では重複がわからない、みたいな状態になっていることもある。
NERのような文字列アノテーションは、細かいルールを守りながら付与していく必要があるので、ツールの使いやすさが作業効率に直結する。 なので、作った。
Layered Span Studio という、重なり合う span を前提にした文字列アノテーションツールである。

ちなみに、「LLMで半自動アノテーションしたい。」という要望は、backend レベルではすでに連携可能。バイブコーディングが得意な方は、自前実装できる状況だ。
続きを読む貸せ、RunpodはKaggleでこう使う
Kaggle - Qiita Advent Calendar 2024 - Qiita 25日目の記事です。
はじめに: Kaggleにおける計算リソースの重要性
Kaggleでは、データサイエンスのコンペティションが開催されており、その多くはGPUを使った計算が必要だ。 例えば、画像認識のコンペティションでは、画像データを学習するために、大量の画像データをGPUで学習する必要がある。 これらの計算は、ローカルのPCでは難しいため、クラウド上の計算リソースを利用することが一般的だ。
そして、Kaggleのコンペティションにおいては、計算リソースの性能が勝敗を分けることが多い。 ぶっちゃけ私のようなセンスのない人間でも、多くの計算リソースを確保し、試行回数をとにかく増やせば、上位に入る確率が高まるのである。 (競プロや数学オリンピックではこうはいかない。資本主義バンザイ。)
計算リソースとしては、AWSやGCPが有名だが、これらは料金が高い。私のような貧民がこれらを多用してしまったら、破産待ったなしである。(資本主義が憎い。) そんな需要を満たすかのように、昨今ではGPUを専門に安く提供するサービスも増えてきている。その中でもRunpodは特に優れたサービスだと感じた。
本ブログでは、Kaggler向けに、Kaggleに特化したRunpodの使い方やそのTipsを紹介する。 さらに、特別ゲストとして、Kaggle Grandmaster であるエチレン( @ethylene_66 ) さんをご招待した。過去コンペでどのようにRunpodを使っていたか、実例を交えて語っていただく。
Runpodの紹介: なぜRunpodを使うのか
Runpodは、オンデマンドでGPUマシンを利用できるクラウドプラットフォームのひとつだ。 AWSやGCPなどの大手クラウドと比べると、手軽な価格帯やアカウント作成〜マシン構築までの簡単さが大きな特徴である。クラウド経験が浅い方でも導入しやすい設計だと感じた。また、他のGPUクラウドと比べて、インターフェイスがわかりやすく、Secrets(マネージドな環境変数管理)などの最低限エンジニアリングに必要な機能が揃っているのが魅力だ。 要約してしまえば、『価格が安く、使いやすい』というのがRunpodを使う理由だ。
どうやってKaggle向けにRunpodを使っていくのか、実際にGUIの操作を交えて説明していこう。 一緒に操作を進めていく方は、まず以下のリンクからRunpodに登録しておこう。
https://runpod.io?ref=6x122dhk 私のリファラルリンクだが、本記事への投げ銭代わりにご登録いただけると嬉しい。
登録が完了したら、作業を進める前にクレジットをチャージしておこう。Runpodは前払い制のサービスである(クラウド破産を免れるのでありがたい限りである)。
多分$10からチャージできる。
まずはStorageから始めよう
https://www.runpod.io/console/home にログインすると、GPU Cloud, Serverless, Storage の3つの選択肢が表示される。

GPU Cloudは、GPUを使った計算環境をデプロイするための機能だ。Kaggleではこの機能をメインに使うことになるだろう。 Serverlessは、GPUを用いたサーバーレスアーキテクチャを構築するための機能だ。今回は使わない。 Storageは、計算環境から切り離された永続データを保存するための機能だ。
実は一番うまく活用するべきなのは、Storage機能である。理由はちょっと複雑なのであとで説明する。 色々と便利なので、まずはGPU Cloudを使う前に、Storageを作っておこう。
Homeから Storage -> New Network Storage をクリックすると、以下のような画面になる。

ここで、Storageをリージョンとサイズを選択して作成する。リージョンによって、使えるGPUの種類が異なるので作成する前には使いたいGPUが使えるリージョンなのかをチェックしておこう。 サイズは、あとからでも増量はできるので、最初は小さめでも問題ない。 設定が終わったら、CreateをクリックしてStorageを作成する。
この前準備をしておいたほうがよい理由は、次にGPU Cloudの紹介をする際にわかる。
GPU Cloudで計算環境をデプロイしてみよう
さて、いよいよGPU Cloudを使って計算環境(Podと呼ばれる)をデプロイしてみよう。
先ほど作ったStorageの右下のDeployボタンをクリックしよう。

すると、GPUを選択したり、Template(要はDocker Image)を選択したりする画面が出てくる。今回はとりあえず、A100のGPUを選択して進めてみよう。

Pod TemplateにはRunpod Pytorch 2.1を選ぶことをおすすめする。Kaggleの推論環境とPythonのバージョン、及び、Cudaのバージョンが合っているためだ。

他にも
- GPUをいくつ搭載するか?
- 長期間の使用を約束する代わりに割引を適用するか?
といった設定項目があるが、各自設定してほしい。 経験上Spotはすぐに止まるので、私は基本的にOn-Demandを使用している。
設定が終わったら、DeployをクリックしてPodをデプロイしよう。
以下のような画面が出てきたら、Podのデプロイが完了だ。あとは、この環境上で、あなたのコードを動かすだけである。Connectと書いてあるボタンを押せば、ssh接続に必要な情報が出てくるのであとは煮るなり焼くなりだ。

この計算環境のライフサイクルは挙動が特別なので、それを説明しないといけない。
- デプロイされたPodを一時停止(処理状態をそのまま保存し、非課金状態に移行すること)することはできない。停止する場合には、ゴミ箱のアイコンを押すしかない。
/workspaceに保存されたデータは永続化される。つまり、それ以外のディレクタに保存したデータはPodを終了すると消える。/workspaceには、Storageで作成したVolumeがマウントされている。(だからはじめにStorageでVolumeを作る必要があったんですね)
この挙動は、Docker Containerと捉えれば素直な挙動である。が、機械学習との相性は悪い。 なぜならば、機械学習では、事前学習済みモデルを用いたり、学習データを用いる計算をすることが多い。さらには、使うライブラリも多く、ライブラリのインストールには時間がかかる物が多いからだ。 起動するたびに環境が初期化されてしまう以上、効率的な機械学習環境のセットアップが重要だ。そのためのTipsを、次の章で説明していこう。
補足:
- Storageを使わなくても、GPU CloudでPodをデプロイすることはできる。その場合、Podを停止することも可能となる。しかし、Podの実体のマシーンが他人に使われているときに、Podを再開することができない。これでは使いたいときに使えないし、停止中のPod内にあるデータを退避させることもできない。だから初手StorageでVolumeを作る必要があったんですね。
- Templateを選択したあと、Edit Templateを押すと、portの設定や、環境変数の設定もできる。もし学習ログの可視化にtensorboardを使いたい場合には、対応する番号のportを開けておくとよいだろう。環境変数に関してはSecrets機能と深く関係するので、次の章で説明する。
Kaggle向け環境構築のTips
Runpodを使って、Kaggle向けの計算環境を構築する際のTipsをQA形式で紹介する。
Q: 作業場所はどこにするべきか?
A: /workspaceの配下にkaggleコンペ用のリポジトリを配置するのをおすすめする。データやモデル等もすべてこの配下に保存することで、Podを再起動してもデータが消えないようにする。
Q: Python環境は?ライブラリのインストールに時間がかかるんだけど
A: Kaggleコンペ用のリポジトリにPoetry環境を作成する。Poetryではリポジトリ直下の.venv/にライブラリをインストールするので、Podを再起動してもライブラリのインストールが不要になる。
なお、リポジトリ直下に.venv/を作成するためには、Poetryの設定ファイルpyproject.tomlに以下の設定を追加する必要がある。
[tool.poetry] virtualenvs-in-project = true
Q: VSCodeでリモート開発するには?
A: これを見ろ。https://docs.runpod.io/tutorials/pods/connect-to-vscode これも見ろ。 https://blog.runpod.io/how-to-connect-vscode-to-runpod/
Q: shellの環境が毎回初期化されるのが不便だ。どうすればいい?
A: 環境setup用のshell scriptを作成しましょう。こればかりはどうしようもなかった。 例えば、私は以下のようなスクリプトを用いている。Podが起動したら初手でこれを実行している。
apt update apt upgrade -y apt install -y fish tmux htop pip install poetry kaggle mkdir ~/.kaggle echo $RUNPOD_SECRET_kaggle_json > ~/.kaggle/kaggle.json # パーミッションを設定 chmod 600 ~/.kaggle/kaggle.json git config --global user.email "{githubのメアド}" git config --global user.name "{githubのユーザ名}"
$RUNPOD_SECRET_kaggle_jsonは、RunpodのSecrets機能を使って、Kaggle APIのトークンを設定している。
認証情報系はSecrets機能を使えば、セキュアに環境変数として管理・受け渡しが可能だ。setup用のscriptにも簡単に組み込めるためオススメである。

Podを作るときに環境変数のところでこんな感じに書いている。

Q: 学習したモデルを保存してたらディスク容量が大きくなり、費用が嵩んできた。どうすればいい?
A: 学習に毎回使わないものに関しては、Google Cloud Storageにアップロードする。とても安い。
実用例 by エチレンさん
ありがたいことに 「Kaggle RunPod 部」の一員として一章書かせてもらえることになったので、布教のために過去コンペでの RunPod 活用例について紹介させていただくことにした。
どちらも RunPod のスケーラビリティに助けられた事例であり、これをきっかけに私が使うためのインスタンスを食い尽くさない程度に RunPod 使用者が増えると嬉しい。
コンペ内容や解法の詳細には踏み込まないので、そちらが気になる方はコンペの Discussion や他の方の解法まとめを参照してもらいたい。
飛行機雲コンペ
コンペ内容:画像セグメンテーション
コンペ終了1週間前、銀圏上位をさまよっていたとき、当時は注目されていなかった強いモデルをチームメイトが発見したおかげで金圏が見えてきていた。 シングルモデルで銀圏上位を取ることが可能な強力なモデルでありなんとしてでもアンサンブルに組み込みたかったものの、learning rate 等のハイパラ調整が難しく、学習に半日ほど要する手のかかるモデルで、残り時間で良いハイパラを引けるかが怪しかった。
そこで計算資源を増やすためにクラウド GPU サーバーを借りることにしたものの、GCP/AWS は高価だし、安価なことで有名な vast.ai はクレカが通らず、途方にくれていた。 ネットの海からなんとか探し出した RunPod には無事登録できたため、最終的にはインスタンスを複数(たしか RTX 4090 と A6000 をそれぞれ2台)立てることでハイパラ調整と 5-fold での訓練をコンペ終了前に完了でき、画像コンペでの初の金メダルを獲得した。
LLM 20 Questions コンペ
コンペ内容:20 Questions という言語ゲームをbot同士に戦わせる
コンペの解法 : https://www.kaggle.com/competitions/llm-20-questions/discussion/531106
詳細は省略するが、複数の 7B〜8B モデルを手元でそれぞれ 400,000,000 回以上推論させる必要がある解法を選択したため、自宅の RTX 4090 1台では到底計算リソースが足りなかった。
そこで例のごとく RunPod で GPU インスタンスを借りることにした。
コンペ終了2週間前での解法選択だったため、贅沢に RTX 4090 が8台刺さったインスタンスを借りることにした。
$3/hour で減っていく残高を見るのは心が傷んだが、無事に1週間程度で必要な推論が終了し、$500の支出で済んだ。
仮に GCP で同程度のインスタンスを借りようとすると4倍以上の価格のため、軽症で済んだとも言える。優勝賞金で回収できたわけだし。
まとめ
Runpodを使えば、安価かつ手軽にGPUリソースを確保でき、Kaggleの勝率を引き上げることができる。大手クラウドに比べて破産リスクが少ないのも良い点である。
本記事では、Kaggle向けにRunpodを使う際のTipsを紹介した。特に、Storageの活用や、Poetryを使ったPython環境の構築、Secrets機能の活用などはあまり情報が出回っていないのではないかと思うので、参考にしていただければ幸いである。
もう一度リファラルリンクを貼っておくので、「Kaggle Runpod 部(?)」への入会をお待ちしてます。 https://runpod.io?ref=6x122dhk
Kaggle - Qiita Advent Calendar 2024 - Qiitaの9日目の記事はRunpodの対抗馬であるvast.aiの解説がなされているので、興味がある方はこちらも合わせて参照されたい。
AIメロディー生成コンテスト 弁財天第二幕 参加記録

概要
2023年10月28日、「弁財天」というAIメロディー生成コンテストにチームメンバーのCapchii(X, Youtube) と一緒に出場した。 コンテストは、運営から伴奏のデータが提供され、それに対して各チームは制限時間内に自身のメロディー生成システムを実行し、生成されたメロディーが聴講者の投票によって評価されるものとなっている。結果として、我々のチームは2位(7チーム中)を獲得。 私たちが心がけていたポイントは、王道なメロディーの作成やメロディーの選定、そして後処理を施すことだった。 本ブログでは、このイベントについての振り返りを行う。実際に生成したメロディーや出場しての感想等を提供する。
- 概要
- 対象の読者
- 大会の仕組み
- 各対戦の結果と生成したメロディー
- 初戦
- 準決勝
- 決勝
- 解法と敗因
- 解法LT
- 我々の思う良いメロディーとは
- 敗因(と推測されること)
- 感想
- 2023-10-30追記
【それを言ってはいけない!を言う】「データ分析失敗事例集」 を読んで
はじめに
2023/08/03発売の「データ分析失敗事例集 ―失敗から学び、成功を手にする―」を知り合いのご厚意により頂いたので、読んでみたところ非常に面白かったので、感想をブログにまとめようと思います。
全編通していい意味で社会性フィルターが外れていて、これを出版することは非常な苦労があったと察します。著者に敬意を評して、本ブログでも特に配慮などはせずに感想を書いていこうと思います。(何か問題があったらコメント欄で教えてください。コメントは公開前に自分にメールが来るようになってます。)
本書の概要
- 本書ではデータ分析の失敗談を短編小説のように楽しむことができる。
- 技術的な話はあまりないが、一部の専門用語については基本的な理解があると読みやすい。
- 例えば、BERT, 傾向スコア, Redshift, Tydyverseと聞いて、どういうものでどういう使われ方をするのか知っているとより良い。
- 著者は社会性フィルターを外し、物事をオブラートに包まずに記述している。この点が本書の価値でもあると感じた。
- 本書の冒頭に「ビジネス側を非難するような内容が含まれる」と書いてある。
- 全体を通じてビジネス側だけでなく、分析側の問題点も明確に指摘している。
- データ分析の具体的な手法の詳細やシステムの構成・実装の方法については言及されていない。
- 大体十数時間で読める分量である。ただし自分は読むのが遅い方なので、人によっては10時間もかからないかもしれない。
読むべき対象者
- データ分析の失敗あるあるを把握しておきたい学生
- 失敗を予め知り、自分の分析に活かしたい人
- 短編小説のような形でデータ分析の失敗談を楽しみたい人
本書の内容と特徴
本書は失敗談の短編集で、合計25個の事例が紹介されている。1事例は8から10ページで説明されていて、テンポよく読むことができる。 各事例の冒頭では、登場人物の立場や所属会社がイラストで整理されているため、各事例の背景がわかりやすい。 各事例では内容をオブラートに包まずに、失敗の原因を明確に指摘しているので痛快な文章である。一部を抜粋すると、以下のような内容である。
- 「調整役ばかりでものづくりをリードする人物がいない」
- 「そのような理由ではBERTをやめられるわけがなかった。このプロジェクトはY氏による『BERTを使ってなにかできないか』プロジェクトだからである。」
- 「半年後には想定以上の値を示すことができた。しかし一旦ダウンした査定が回復することはなく担当データサイエンティストは退職した。」
- 「効果検証分析の真の目的はすでに決定済みの社内意志の統一化であり、新たな意思決定に寄与することではなかった。」(意訳)
データ分析の失敗事例だけでなく、データサイエンティストの人事事情などもコラムとして紹介されていて興味深かった。「コラム データサイエンティストの人事事情」は皆様も気になるところではないだろうか?
印象に残った事例
以下の事例が特に印象的であった。
- CASE9 そんな目的変数で大丈夫か?
- CASE15 プロダクトアウトでもドメイン知識は大事
- CASE21 頑張って予測していたのは...
- コラム 絶対失敗しないデータ分析
- CASE10 成功した報告しか聞きたくない
上4つに関しては、個人的に学びが多いという点で印象に残った。ネタバレは避けるが「そんなところに分析上の罠が...」といった感想だ。特に「コラム 絶対失敗しないデータ分析」は本書の最終章であるが、今までとは異なり非常に真面目な文章で(いやずっと真面目だったろ)、データ分析にかける思いがアツく書かれている。
最後の一つCASE10に関しては、あまりにもデータサイエンティストが不遇で読んでてお腹が痛くなる感じがした。そういう意味で印象に残った。
おすすめです
全体として、本書はデータ分析の「失敗談」に焦点を当てた短編集という特異なアプローチで、データ分析の現場で起きる様々な問題をリアルに描き出している。読者がデータ分析の現場で犯しやすい間違いや誤解を理解し、それらを避けるための手がかりを得ることができる点で非常に価値がある。 この本を読むことで、データ分析の現場での課題や困難がどのようなものかを理解し、それを避けるための知識を身につけることができるだろう。それにより、より高品質な分析結果を生み出すことができるようになるに違いない。
【Streamlitよりいいかも?】機械学習系のデモアプリ作成に最適!Gradio解説
- はじめに
- Streamlit vs Gradio
- Gradioの設計思想
- Interface
- 入出力に応じたUI
- Interface String Shortcut
- 入力データのサンプルのセット
- ドキュメンテーション
- テーマの変更
- タイムアウトへの対処
- 中級者への第一歩、デモを作る際に知っておきたい処理
- Gradioが担当する前処理について
- プログレスバー
- もろもろの出力結果を保存するには?
- 認証認可(というか認可)
- その他、解説しないが需要の有りそうなもの
- まとめ
追記 : 動画になりました。
はじめに
機械学習系のデモアプリを作成することがしばしばありStreamlitを使用していたが、パラメーターなどをいじるたびに処理が最初から走るなどといった挙動に悩まされていた。 同僚がGradioというのを使っていたのでサーベイがてらメモしていたらブログが出来上がってしまった。
本ブログでは、GradioのQuickstart以上の内容に踏み込み、実際に実装するときに検索するだろうことをまとめた。 これを読めばGradio中級者と自称できるぐらいにはなるのではないかと思う。
対象読者は以下を想定している。
- Pythonの基本的な文法(代入や関数宣言、コンテクストマネージャー(with句)など)を知っている方。
- GradioのQuickstart(チュートリアル)以上に詳しくなり、実際にでもアプリを作るときに発生しがちな疑問点を事前に解消しておきたい方。
- Streamlitを使ったことのある方だとより楽しめる内容である。
Streamlit vs Gradio
Streamlit使用者に向けて、StreamlitとGradioを比較した所感を共有する。Streamlitを使ったことのない方は読み飛ばしていただいても構わない。
まずStreamlitの良い点を上げると以下の点である。
| Streamlit | Gradio | |
|---|---|---|
| 文献の多さ | 比較的多い | 比較的少ない |
| デザイン | 美しい (主観) | デフォルトのデザインがダサい (主観) |
| UIコンポーネント | 豊富 | 機械学習に最適化されたUIコンポーネント |
次にGradioの良い点は以下の点だと感じた。
続きを読むAI画像加工ツールClipdropの全機能を検証 (有料機能含む)
Clipdropとは?
https://clipdrop.co/ で提供されるAI画像加工サービス。
昨今職業驚き屋さんが驚き始めたのを感じるので今日はその実態に迫っていく。 検証に際しては有料登録もして比較するので参考になればと思う。
追記 : 動画にしていただきました!
- Clipdropとは?
- Clipdropでできる9つのこと
- 有料版と無料版の違い
- 各機能の調査
- 機能1: Cleanup
- 機能2: Text Remover
- 機能3: Remove Backgrounds
- 機能4: Replace Background
- 機能5: Relight
- 機能6: Upscale Image
- 機能7: Generate Image (Stable Diffusion)
- 機能8: Reimagine XL
- 機能9: Uncrop
- まとめ
ちなみに驚き屋さんのツイートには以下のようなものがあった。敵を作りたくないので特定が不可能な程度にChatGPTに変換させてあります。
「Clipdropと名付けられたこのサービスを試すと、全体的にその優れた性能に感動する!不必要な要素を除去する、主体を抽出する、さらには照明を調節することも可能。高解像度の画像をダウンロードするには料金が発生するが、1024x1024pxまでなら無料で使えるので、ウェブにて使用する際には無料範囲でも差し支えないと思われる。」
「【一切の費用なし・申し込み不必要・ウェブ対応】Clipdropが劇的に進化したところを皆様に紹介したいと思います。信じられないことに、無料かつ登録不要で利用できるジェネレーティブな塗りつぶしのような新機能が追加されていました!提供者であるhttp://Stability.aiさんは信頼できる有名企業なのでご安心ください。この新機能について、リプ欄で詳しく説明します😊」
「#ClipDrop を使ってみると驚愕した。Midjourneyで制作したクマと少女をさらにジェネレートしてみるとこのように変わった。クマの下部から別の足と思われるものが覗いている。」
Clipdropでできる9つのこと
続きを読むKaggle Masterになった日記
- Kaggle Masterになった
- "Feedback Prize - English Language Learning" で金メダル
- 今後はどうしようか
Kaggle Masterになった
"Feedback Prize - English Language Learning" (以下FB3) で金メダルを取得した結果、メダルの条件を満たし、Kaggle Competitions Masterになることができた。FB3については後で思い出を語ることにしよう。
Kaggle Competitions Masterになるための条件とは金メダル1つと銀メダル以上2つである。実は過去に金メダルを取得したことがあったので、FB3では銀メダルでもMasterになることはできたのだが、2枚目の金メダルでmasterになることができて非常に嬉しい。実力を示せてよかったと感じた。どうやらKaggle Masterはアクティブユーザーの上位1%に入る実力らしい?
金メダルが2枚あるとちょっとプロフィールが強く見えないですか?そうでもない?

お気づきの方もいらっしゃるかもしれないが、今まで参加したコンペは3つとも自然言語処理に関するコンペである。 結果的にということもあるが、自然言語コンペに絞って出場することで素早くKaggle Masterになることができたと思う。
続きを読む