Snowflake Notebooks でのエラーのトラブルシューティング¶
次のシナリオは、 Snowflake Notebooks 使用時に発生する可能性のある問題のトラブルシューティングに役立ちます。
ノートブック総数が制限を超過¶
アカウント内のノートブックの総数が6000を超え、Notebooksを更新すると、以下のエラーが発生します。
Result size for streamlit list exceeded the limit. Streamlit list was truncated.
ユーザーは引き続き新しいノートブックを作成できますが、Snowflakeではアカウントで使用しなくなったノートブックを削除することを推奨しています。
snowflake.coreパッケージの競合¶
Snowpark Python APIs を使用するには、パッケージセレクターから snowflake.core
を使用します。 snowflake.core
と snowflake
の両方を追加しても、バージョンが異なれば、パッケージの競合エラーが返されます。
パッケージ更新時のNotebooks(ウェアハウスのランタイム)エラー¶
Snowflakeでは、サポートされなくなった古い snowflake-ml
パッケージを廃止しました。パッケージセレクターから削除され、Snowflake Anacondaチャンネルで利用することはできません。 snowflake-ml
を使用しており、ノートブックのパッケージを追加、削除、更新しようとすると、 snowflake-ml
にはすでにアクセスできないため、これらのノートブックは失敗します。
問題を回避するには、Snowflake ML の正しいパッケージである snowflake-ml-python
に切り替えてください。
AttributeError: NoneType
¶
ノートブックの既存の変数と同じ名前にセル名を変更すると、以下のエラーが発生します。
AttributeError: ‘NoneType’ object has no attribute ‘sql’
たとえば、 cell1
というPythonのセルに以下があるとします。
session = get_active_session() #establishing a Snowpark session
その後、 cell2
の名前を「session」に変更し、 cell3
で「session」を参照すると、 NotebooksはSnowparkのセッションではなく、「session」(セル名)を参照しようとしてエラーになります。
早期切断¶
ノートブックセッションはストアドプロシージャとして実行されます。ノートブックが1時間のタイムアウト前に予期せず切断される場合、 ACCOUNTADMIN またはウェアハウス所有者が STATEMENT_TIMEOUT_IN_SECONDS パラメーターを特定の値(5分など)に設定している可能性があります。これは、ノートブックセッションを含め、ウェアハウス上ですべてのステートメントが実行できる時間を制限するものです。このパラメーターはウェアハウスまたはアカウントレベルで設定されますが、ウェアハウスとセッションの両方で設定された場合、ゼロでない最も小さい値が強制されます。ノートブックをより長く実行するには、デフォルトのウェアハウス SYSTEM$STREAMLIT_NOTEBOOK$WAREHOUSE を使うか、 STATEMENT_TIMEOUT_IN_SECONDS パラメーターをより長い時間に変更します。
ファイアウォールにより接続できません¶
ノートブックを起動しようとすると、次のようなポップアップが表示されます。
Something went wrong. Unable to connect. A firewall or ad blocker might be preventing you from connecting.
ネットワークで *.snowflake.app
が許可リストにあり、Snowflakeに接続できることを確認します。このドメインが許可リストにあると、アプリは何の制限もなくSnowflakeサーバーと通信できます。
さらに、Snowflakeバックエンドへの接続に問題が発生しないように、ネットワーク構成で WebSockets がブロックされていないことを確認してください。
アクティブなウェアハウスが選択されていません¶
このエラーを解決するには、 USE WAREHOUSE コマンドでセッションのウェアハウスを指定するか、ノートブックでウェアハウスを選択してください。ノートブックのウェアハウスを選択する手順については、 Snowflakeノートブックを実行するためのウェアハウスの推奨事項 をご参照ください。
さらに、ノートブックが使用しているウェアハウス、データベース、スキーマへのアクセス権限を持たないロールを使用している場合、このエラーが表示されます。作業を続けられるように、これらのリソースにアクセスできるロールに切り替える必要があります。
欠落しているパッケージ¶
ノートブック環境にインストールされていないパッケージを使用しようとしている場合、セル出力に以下のメッセージが表示されます。
ModuleNotFoundError: Line 2: Module Not Found: snowflake.core. To import packages from Anaconda, install them first using the package
selector at the top of the page.
ノートブックで使用するPythonパッケージをインポートする ページの指示に従って、必要なパッケージをインポートします。
既存のノートブックから欠落しているパッケージ¶
ノートブックの新バージョンは継続的にリリースされ、ノートブックは最新バージョンに自動アップグレードされます。古いノートブックをアップグレードすると、ノートブック環境のパッケージがアップグレードに対応していないことがあります。ノートパソコンが起動しなくなる可能性があります。
以下は、 Libpython
パッケージが欠落している場合のエラーメッセージの例です。
SnowflakeInternalException{signature=std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool):"libpython_missing", internalMsg=[XP_WORKER_FAILURE: Unexpected error signaled by function 'std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool)'
Assert "libpython_missing"[{"function": "std::vector<sf::RuntimePathLinkage> sf::{anonymous}::buildRuntimeFileSet(const sf::UdfRuntime&, std::string_view, const std::vector<sf::udf::ThirdPartyLibrariesInfo>&, bool)", "line": 1307, "stack frame ptr": "0xf2ff65553120", "libPythonOnHost": "/opt/sfc/deployments/prod1/ExecPlatform/cache/directory_cache/server_2921757878/v3/python_udf_libs/.data/4e8f2a35e2a60eb4cce3538d6f794bd7881d238d64b1b3e28c72c0f3d58843f0/lib/libpython3.9.so.1.0"}]], userMsg=Processing aborted due to error 300010:791225565; incident 9770775., reporter=unknown, dumpFile= file://, isAborting=true, isVerbose=false}
このエラーを解決するには、以下の手順をお試しください:
ウェブページをリフレッシュし、ノートブックを再度起動します。
それでも問題が解決しない場合は、次のステップとしてパッケージピッカーを開き、インストールされているパッケージがすべて有効かどうかを確認します。各パッケージのドロップダウンで、利用可能なバージョンを確認できます。最新バージョンのパッケージを選択すると、通常はエラーが解消されます。
読み取り専用ファイルシステムの問題¶
Pythonライブラリの中には、データをローカルユーザディレクトリにダウンロードしたりキャッシュしたりするものがあります。ただし、デフォルトのユーザーディレクトリ /home/udf
は読み取り専用です。これを回避するには、パスを書き込み可能な場所である /tmp
に設定します。書き込みディレクトリの設定に使用する環境変数は、使用するライブラリによって異なる場合があることに注意してください。以下は、この問題が発生する既知のライブラリのリストです。
matplotlib
HuggingFace
catboost
matplotlibの例¶
matplotlibを使用すると、次のような警告が出ます。
Matplotlib created a temporary cache directory at /tmp/matplotlib-2fk8582w because the default path (/home/udf/.config/matplotlib) is
not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular
to speed up the import of Matplotlib and to better support multiprocessing.
以下のコードでは、この警告を解決するために、 MPLCONFIGDIR
変数を /tmp/
に設定しています。
import os
os.environ["MPLCONFIGDIR"] = '/tmp/'
import matplotlib.pyplot as plt
Huggingfaceの例¶
Huggingfaceを使用すると、次のような警告が返されます。
Readonly file system: `/home/udf/.cache`
次のコードでは、 HF_HOME
と SENTENCE_TRANSFORMERS_HOME
変数を /tmp/
に設定することで、このエラーを解消しています。
import os
os.environ['HF_HOME'] = '/tmp'
os.environ['SENTENCE_TRANSFORMERS_HOME'] = '/tmp'
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Snowflake/snowflake-arctic-embed-xs")
df.collect()
を使用する際の出力メッセージが大きすぎます。¶
df.collect()
を実行すると、セル出力に以下のメッセージが表示されます。
MessageSizeError: Data of size 522.0 MB exceeds the message size limit of 200.0 MB.
This is often caused by a large chart or dataframe. Please decrease the amount of data sent to the browser,
or increase the limit by setting the config option server.maxMessageSize.
Click here to learn more about config options.
Note that increasing the limit may lead to long loading times and large memory consumption of the client's browser and the Streamlit server.
Snowflake Notebooks 以下のような大規模なデータセットの場合、セル出力の結果は自動的に切り捨てられます。
すべてのSQLセル結果。
snowpark.Dataframe
の場合のPythonセル結果。
上のセルの問題は、 df.collect()
が snowpark.Dataframe
ではなく List
を返すことです。リストは自動的に切り捨てられません。この問題を回避するには、 DataFrame の結果を直接出力します。
df
Snowpark DataFrames 上で df.to_pandas()
を使用すると、ノートブックがクラッシュします。¶
df.to_pandas()
を実行すると、すべてのデータがメモリにロードされるため、データサイズが関連付けられたNotebookウェアハウスのメモリ制限を超えると、Notebookセッションが終了することがあります。
data = session.table("BIG_TABLE")
df = data.to_pandas() # This may lead to memory error
一般的に、大規模なデータセットの場合、Snowflakeは df.to_pandas()
の使用を避けることを推奨します。代わりに、pandasを使用してデータを操作するには、Snowpark pandas API を使用します。 Snowpark pandas API を使用すると、Snowflakeのデータに対してpandasコードを直接実行して、計算を SQL にプッシュダウンできるため、メモリに収まるデータしか扱えないという制限がなくなります。
以下の例では、Snowpark pandasでテーブルを読み取るようにコードを書き換える方法を示しています。
# Import Snowpark pandas
import modin.pandas as pd
import snowflake.snowpark.modin.plugin
# Create a Snowpark pandas DataFrame from BIG_TABLE
df = pd.read_snowflake("BIG_TABLE")
# Keep working with your data using the pandas API
df.dropna()
詳細については、 ノートブックのSnowpark pandas をご参照ください。