❄️

君はArcticというオープンソースLLMを知っているか?

2024/05/10に公開

こんにちは!kirigayaです。
今回はSnowflakeから出たオープンソースLLMArcticで遊んでいこうと思います。
イケイケなSnowflakeからLLMが出るなんてワクワクしますね!
公式ブログはこちら:公式ブログ

今回遊ぶ環境ですがSnowflakeの無料アカウントを作成しColabから遊ぶ感じになります。
オープンソースなのにSnowflakeからしか使えないの?と思うかもしれないですが
ローカルで動かそうと思うとハイスペックなPCを用意する必要があります...
クラウドでも高級なインスタンスを立てる必要が出てきます...
学生だと破産してしまう...(´・ω・)

ReplicateなどのサービスからAPI経由で遊ぶこともできます。

ということで...今回はSnowflakeのCortexから使っていこうと思います!

チャット機能のみを試してみたいという方はこちらから
https://huggingface.co/spaces/Snowflake/snowflake-arctic-st-demo

さっそく設定していきましょう!
①無料トライアルアカウントを作成
②Cortexを使えるようにする
大規模言語モデル(LLM)関数(Snowflake Cortex)
CortexのLLM関数はMistral、Reka、Meta、Google などの企業が出しているLLMに簡単にアクセスすることができます。
LLMはSnowflakeが完全にホストしているので環境設定などを行う必要がないのがポイントです。

Arcticが使えるAWS-US-West2(Oregon)にアカウントを作成

-- ロール切り替え
use role orgadmin;
-- アカウント情報(オレゴンに作成)
create account cortex_account
  admin_name = admin
  admin_password = 'XXXXXXXXXX'
  first_name = test
  last_name = kirigaya
  email = 'myemail@myorg.org'
  edition = standard
  region = aws_us_west_2;

作成したら管理者→アカウント→URLを取得して設定したアカウントでログインし新しいパスワードを設定してください。(リージョンが変わる)
新しいアカウントで新しいシートを作成しアカウントを切り替えてcortexの設定を続ける

-- ロールのAccountAdminを使用する
use role ACCOUNTADMIN;

-- ウェアハウスを作成
create warehouse if not exists cortex_wh warehouse_size = xsmall;

-- cortex_userロールからウェアハウスが使えるよう設定
grant usage on warehouse cortex_wh to role cortex_user_role;

-- adminユーザーが使用するデフォルトウェアハウスをcortex_whに設定
alter user admin set default_warehouse = cortex_wh;

-- 現在のセッションで使用するウェアハウスを設定
use warehouse cortex_wh;

-- 新しいカスタムロールcortex_user_roleを作成する
create role cortex_user_role;

-- Snowflakeが提供するCORTEX_USERというデータベースロールを
-- 新しく作成したcortex_user_roleロールに付与する
-- CORTEX_USERロールには特定の権限がセットされている
grant database role SNOWFLAKE.CORTEX_USER to role cortex_user_role;

-- 作成したcortex_user_roleロールをsdminユーザーに付与する
-- これによりadminユーザーがCORTEX_USERロールの権限を持つ
grant role cortex_user_role to user admin;

-- 作成したロールを選択
use role cortex_user_role;

-- cortex LLM動作確認
select snowflake.cortex.complete('snowflake-arctic',
 [{'role':'user','content':'あなたは私のプログラミングを支援するためのパートナーです。'}],
 {'temperature': 0.7}
);

動作確認結果はこんな感じ

Colabノートブックから遊んでみる

ノートブックに認証情報を追加する
※Kaggleは関係ない...

Snowpark-MLインストールドキュメント

! pip install -q snowflake-connector-python
! pip install -q snowflake-snowpark-python
! pip install -q snowflake-ml-python

Arcticを使ってみる

Snowpark-ML APIリファレンス(Python)
※ウェアハウスの起動を忘れずに!

import snowflake.connector as sc
import snowflake.snowpark as spk
import snowflake.cortex as scx

from google.colab import userdata

# 認証情報の設定
snowflake_config = {
    'user' : userdata.get('CORTEX_USER'),
    'password' : userdata.get('CORTEX_PASSWORD'),
    'account' : userdata.get('SNOWFLAKE_ACCOUNT' ),
    'role' : userdata.get('SNOWFLAKE_ROLE'),
    'warehouse' : userdata.get('SNOWFLAKE_WAREHOUSE'),
}

# 認証オブジェクトを作成
connect_to_snowflake = sc.connect(**snowflake_config)

# Snowparkのセッションを作成
spk.Session.builder.configs({"connection": connect_to_snowflake}).create()

prompt = "あなたは私のプログラミングを支援するためのパートナーです。"

response = scx.Complete("snowflake-arctic", prompt)
print(response)

# セッションを削除
spk.Session.getActiveSession().close()

セッションエラー

セッションを指定する必要がある

# 認証オブジェクトを作成
connect_to_snowflake = sc.connect(**snowflake_config)

# Snowparkのセッションを作成
spk_session = spk.Session.builder.configs({"connection": connect_to_snowflake}).create()

prompt = "あなたは私のプログラミングを支援するためのパートナーです。"

# セッションを指定してプロンプトを送信
response = scx.Complete("snowflake-arctic", prompt, session=spk_session)
print(response)

# セッションを削除
spk_session.close()

Completeのパラメータはこんな感じ

def Complete(
model: Union[str, Column],
prompt: Union[str, Column],
session: Optional[Session] = None
) -> Union[str, Column]:
   """
   LLM推論サービスに対してコンプリーション処理を実行する呼び出しを行います。

   Parameters:
   -----------
   model: Union[str, Column]
       モデルタイプを表す文字列の列
   prompt: Union[str, Column]
       LLM に送信するプロンプトの列
   session: Optional[Session]
       使用する Snowpark セッション。指定しない場合はコンテキストから推測されます。

   Returns:
   --------
   Union[str, Column]
       文字列応答の列

   Notes:
   ------
   この関数は実験的機能であり、バージョン 1.0.12 以降で利用可能です。
   """

論文から情報を抽出してみる

今回はMetaから出たMulti-token Predictionの論文を試してみます。
論文

import re
import pandas as pd
from pypdf import PdfReader

def extract_text_from_pdf(file_path: str, start_page: int = 1, end_page: int = None) -> str:
    """
    PDFファイルから指定されたページ範囲のテキストコンテンツを抽出し、単一の文字列として返します

    Args:
        file_path (str): PDFへのパス
        start_page (int): 抽出を開始するページ番号 (デフォルトは1)
        end_page (int): 抽出を終了するページ番号 (デフォルトはNone、最後のページまで)

    Returns:
        str: テキストコンテンツ
    """
    text_list: list[str] = []
    reader = PdfReader(file_path)
    number_of_pages: int = len(reader.pages)

    # ページ範囲のチェック
    start_page = max(start_page, 1)  # 1ページ未満は無効
    end_page = end_page if end_page is not None else number_of_pages + 1  # Noneの場合は最後のページまで

    # ページ毎にテキストを抽出
    for i in range(start_page - 1, end_page - 1):
        if i >= number_of_pages:
            break
        page_data: dict = reader.pages[i]
        # 改行を削除して抽出
        page_text: str = page_data.extract_text(extraction_mode="layout", layout_model_space_vertically=False)
        text_list.append(page_text)

    combined_text: str = "".join(text_list)
    # テキストの連続した空白を1つの空白に置き換える
    combined_text = re.sub(r'\\s+', ' ', combined_text)

    return combined_text

data = extract_text_from_pdf("/content/2404.19737v1.pdf", end_page=2)

# プロンプト
prompt = f"""ここに論文があります: <curriculum vitae>{data}</curriculum vitae>

以下の情報を抽出しjson形式で生成してください:
1. Abstractをわかりやすいように要約して抽出してください(Abstractキーで)
"""

# 英語プロンプト
prompt_en = f"""Here is a research paper: <curriculum vitae>{data}</curriculum vitae> Please extract the following information and generate it in Markdown format:

1. Extract and summarize the Abstract in a clear and concise manner.
"""

# セッションを指定してプロンプトを送信
extract_entity = scx.Complete("snowflake-arctic", prompt, session=spk_session)
print(extract_entity)

アウトプット

"Abstract": "この論文では、多くのトークンを予測することで、より良いと高速な大規模言語モデルを開発する方法を提案しています。これまでの....

すぐに超えてしまう...
パラメータの指定がコネクタからだとできない?...

Arcticどうでしたか?遊ぶにしては少し使いずらい印象でした...
チューニングするにしてもLlama3の方が良い気がします...
もっと良い使い方を探してみよう...
Snowflake内で自然言語によるデータ加工とかに使えそう。
お疲れ様でした...

おまけ

  • ArcticってLLMの中でどうなの?
    パラメータサイズは480B(4800億)
    トークンサイズは4K(少ない...32Kになる予定)
    リーダーボードには載っていない
    データセットはwebコンテンツ、コード、SQL、STEMを含むパブリックドメインから調達された
    3兆5000億トークン公式ブログ

  • アーキテクチャに関する記事
    Arcticは高密度transformerとMoEによるハイブリッドでメモリの効率化と推論の高速化などを実現しているそうです。
    10Bの高密度トランスモデルと128×3.66BのMoE MLPを組み合わせ、トップ2ゲーティングで合計480B、アクティブパラメータ17B
    公式ブログ1
    公式ブログ2

クックブックはこちら:arctic-cookbook
treamlit と Snowflake Cortex を使用して、検索拡張生成 (RAG) ベースの LLM アシスタントを構築する

岩田組

Discussion