onnx-maker / app.py
Sakalti's picture
Create app.py
484ac3f verified
import os
import torch
import onnx
import gradio as gr
from transformers import AutoModel, AutoTokenizer
from huggingface_hub import HfApi, HfFolder, Repository
# モデルをONNXに変換する関数
def convert_to_onnx_custom_tensors(model_name, tensor_list, output_path="model.onnx"):
# モデルとトークナイザをロード
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
# ユーザー指定のテンソル内容をパースして作成
try:
input_tensors = []
for tensor_str in tensor_list:
input_tensors.append(torch.tensor(eval(tensor_str)))
# ダミーの例として、最初の2つのテンソルをinput_idsとattention_maskとして使用
input_ids = input_tensors[0] if len(input_tensors) > 0 else torch.zeros((1, 1))
attention_mask = input_tensors[1] if len(input_tensors) > 1 else torch.ones((1, 1))
except Exception as e:
return f"テンソル作成中にエラーが発生しました: {e}"
# モデルをONNXにエクスポート
try:
torch.onnx.export(
model,
(input_ids, attention_mask),
output_path,
input_names=["input_ids", "attention_mask"],
output_names=["output"],
dynamic_axes={"input_ids": {0: "batch_size"}, "attention_mask": {0: "batch_size"}},
opset_version=11
)
return f"モデルをONNX形式で{output_path}にエクスポートしました。"
except Exception as e:
return f"ONNX形式へのエクスポート中にエラーが発生しました: {e}"
# Hugging Face Hubにデプロイする関数
def deploy_to_huggingface(access_token, repo_name, model_path="model.onnx"):
# Hugging Face Hubへの認証
HfFolder.save_token(access_token)
api = HfApi()
# リポジトリを作成 (もし存在しない場合)
try:
if not api.model_info(repo_name, use_auth_token=access_token):
api.create_repo(repo_name, exist_ok=True, token=access_token)
# リポジトリにファイルをアップロード
repo = Repository(local_dir=repo_name, clone_from=repo_name, use_auth_token=True)
repo.git_pull()
repo.lfs_track(["*.onnx"])
os.makedirs(repo_name, exist_ok=True)
model_output_path = os.path.join(repo_name, "model.onnx")
os.rename(model_path, model_output_path)
repo.git_add()
repo.git_commit("Add ONNX model")
repo.git_push()
return f"{repo_name}にONNXモデルをデプロイしました。"
except Exception as e:
return f"デプロイ中にエラーが発生しました: {e}"
# AIの基本的な仕組みの解説
def ai_explanation():
explanation = """
AI(人工知能)は、人間の知的作業を模倣する技術です。
特にディープラーニングはニューラルネットワークを用いて、大量のデータから特徴を学習し、分類や予測などを行うことができます。
モデルはトレーニングフェーズでデータを用いて学習し、その後の推論フェーズで新しいデータに対して応答を生成します。
ONNXは異なるフレームワーク間で互換性を持たせるための形式で、PyTorchやTensorFlowのモデルを統一的に使うことができます。
"""
return explanation
# Gradioインターフェースの作成
def main():
with gr.Blocks() as demo:
gr.Markdown("# ONNXモデル変換・デプロイツールとAIの解説")
# AIの基本説明セクション
with gr.Tab("AIの基本説明"):
explanation = gr.Markdown(ai_explanation())
# ONNX変換セクション
with gr.Tab("ONNXモデルの変換"):
model_name = gr.Textbox(label="モデル名", placeholder="例: bert-base-uncased")
tensor_list = gr.Dataframe(headers=["テンソルの内容"], datatype="str", row_count=3, col_count=1, placeholder="例: [[101, 2057, 2024, 102]]")
convert_btn = gr.Button("ONNXに変換")
output = gr.Textbox(label="出力メッセージ")
convert_btn.click(
convert_to_onnx_custom_tensors,
inputs=[model_name, tensor_list],
outputs=output
)
# デプロイセクション
with gr.Tab("Hugging Faceにデプロイ"):
access_token = gr.Textbox(label="Hugging Faceアクセストークン", type="password")
repo_name = gr.Textbox(label="リポジトリ名")
deploy_btn = gr.Button("デプロイ")
deploy_output = gr.Textbox(label="デプロイ出力")
deploy_btn.click(
deploy_to_huggingface,
inputs=[access_token, repo_name],
outputs=deploy_output
)
demo.launch()
if __name__ == "__main__":
main()