Sie möchten also … so schnell wie möglich ein ML-Modell in Snowflake erstellen | von Michael Taylor | Juni 2023

0
25


In Jupyter : Meine bevorzugte Choice, aber es wird davon ausgegangen, dass Sie bereits Zugriff auf ein Notizbuch haben (oder damit vertraut sind).

In einem Schneeflocken-Arbeitsblatt: Die Route wird weniger befahren, ist aber wohl einfacher, wenn Sie keinen einfachen Zugang zu einer Pocket book-Umgebung haben

Erstellen Sie zunächst ein JSON mit Ihren Anmeldeinformationen

Es sollte ungefähr so ​​aussehen

{
"account": "your_account_name",
"person": "your_user_name",
"password": "insert_your_pwd_here",
"position": "ACCOUNTADMIN"

Stellen Sie als Nächstes sicher, dass Sie über die erforderlichen Pakete verfügen

Die Foundation-Python-Umgebung sollte die meisten Pakete enthalten, verfügt aber wahrscheinlich nicht über die Snowflake-spezifischen Dinge. Befolgen Sie daher diese Anweisungen:

Erstellen Sie zunächst eine Datei pysnowpark_ml.yml und kopieren Sie diese hinein

https://carbon.now.sh/?bg=rgba%2528171%252C+184%252C+195%252C+1%2529&t=one-light&wt=none&l=yaml&width=680&ds=true&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv =56px&ph=56px&ln=false&fl=1&fm=Hack&fs=14px&lh=133%2525&si=false&es=2x&wm=false&code=name%25253A%252520pysnowpark_ml%25250Achannels%25253A%25250A%252520%2525 20-%252520https%25253A%25252F%25252Frepo.anaconda. com%25252Fpkgs%25252Fsnowflake%25250A%252520%252520-%252520defaults%25250Adependencies%25253A%25250A%252520%252520-%252520aiofiles%25253D22.1.0%252 53Dpy38hecd8cb5_0%25250A%252520%252520-%252520aiosqlite%25253D0.18.0%25253Dpy38hecd8cb5_0%25250A %252520%252520-%252520argon2-cffi%25253D21.3.0%25253Dpyhd3eb1b0_0%25250A%252520%252520-%252520argon2-cffi-bindings%25253D21.2.0%25253Dpy38hca 72f7f_0%25250A%252520%252520-%252520babel%25253D2.11.0%25253Dpy38hecd8cb5_0% 25250A%252520%252520-%252520backcall%25253D0.2.0%25253Dpyhd3eb1b0_0%25250A%252520%252520-%252520brotlipy%25253D0.7.0%25253Dpy38h9ed2024_ 1003%25250A%252520%252520-%252520ca-certificates%25253D2023.05.30%25253Dhecd8cb5_0%25250A%252520 %252520-%252520certifi%25253D2023.5.7%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520cffi%25253D1.15.1%25253Dpy38h6c40b1e_3%25250A% 252520%252520-%252520comm%25253D0.1.2%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520decorator %25253D5.1.1%25253Dpyhd3eb1b0_0%25250A%252520%252520-%252520defusedxml%25253D0.7.1%25253Dpyhd3eb1b0_0%25250A%252520%252520-%252520en trypoints%25253D0.4%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520flit-core%25253D3. 8.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520icu%25253D58.2%25253Dh0a44026_3%25250A%252520%252520-%252520idna%25253D3.4% 25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520importlib-metadata%25253D6.0.0%25253Dpy38hecd8cb5_0 %25250A%252520%252520-%252520importlib_metadata%25253D6.0.0%25253Dhd3eb1b0_0%25250A%252520%252520-%252520importlib_resources%25253D5.2.0%25253Dpyhd 3eb1b0_1%25250A%252520%252520-%252520ipython_genutils%25253D0.2.0%25253Dpyhd3eb1b0_1%25250A%252520% 252520-%252520jinja2%25253D3.1.2%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520json5%25253D0.9.6%25253Dpyhd3eb1b0_0%25250A%252520 %252520-%252520jsonschema%25253D4.17.3%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520jupyter_client% 25253D8.1.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520jupyter_core%25253D5.3.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520ju pyter_events%25253D0.6.3%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520jupyter_server%25253D1.23.4%25253Dpy38hecd8cb5_0 %25250A%252520%252520-%252520jupyter_server_fileid%25253D0.9.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520jupyter_server_ydoc%25253D0.8.0%25253D py38hecd8cb5_1%25250A%252520%252520-%252520jupyter_ydoc%25253D0.2.4%25253Dpy38hecd8cb5_0%25250A%252520% 252520-%252520jupyterlab%25253D3.6.3%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520jupyterlab_pygments%25253D0.1.2%25253Dpy_0%25250A%252520% 252520-%252520jupyterlab_server%25253D2.22.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520libcxx% 25253D14.0.6%25253Dh9765a3e_0%25250A%252520%252520-%252520libffi%25253D3.4.2%25253Dhecd8cb5_6%25250A%252520%252520-%252520libiconv%25 253D1.16%25253Dhca72f7f_2%25250A%252520%252520-%252520libsodium%25253D1.0.18%25253Dh1de35cc_0 %25250A%252520%252520-%252520libxml2%25253D2.10.3%25253Dh930c0e2_0%25250A%252520%252520-%252520libxslt%25253D1.1.37%25253Dh6d1eb0 e_0%25250A%252520%252520-%252520lxml%25253D4.9.2%25253Dpy38h6c40b1e_0%25250A%252520% 252520-%252520matplotlib-inline%25253D0.1.6%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520ncurses%25253D6.4%25253Dhcec6c5f_0%25250A%2525 20%252520-%252520nest-asyncio%25253D1.5.6%25253Dpy38hecd8cb5_0%25250A%252520%252520 -%252520notebook%25253D6.5.3%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520notebook-shim%25253D0.2.2%25253Dpy38hecd8cb5_0%25250A%252520%25252 0-%252520openssl%25253D1.1.1u%25253Dhca72f7f_0%25250A%252520%252520-% 252520packaging%25253D23.0%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520pandocfilters%25253D1.5.0%25253Dpyhd3eb1b0_0%25250A%252520%252520-% 252520parso%25253D0.8.3%25253Dpyhd3eb1b0_0%25250A%252520%252520-%252520pexpect%25253D4.8.0 %25253Dpyhd3eb1b0_3%25250A%252520%252520-%252520pickleshare%25253D0.7.5%25253Dpyhd3eb1b0_1003%25250A%252520%252520-%252520pip%25253D22. 3.1%25253Dpy38hecd8cb5_0%25250A%252520%252520-%252520pkgutil-resolve-name%25253D1.3

title: pysnowpark_ml
channels:
- https://repo.anaconda.com/pkgs/snowflake
- defaults
dependencies:
- aiofiles=22.1.0=py38hecd8cb5_0
- aiosqlite=0.18.0=py38hecd8cb5_0
- argon2-cffi=21.3.0=pyhd3eb1b0_0
- argon2-cffi-bindings=21.2.0=py38hca72f7f_0
- babel=2.11.0=py38hecd8cb5_0
- backcall=0.2.0=pyhd3eb1b0_0
- brotlipy=0.7.0=py38h9ed2024_1003
- ca-certificates=2023.05.30=hecd8cb5_0
- certifi=2023.5.7=py38hecd8cb5_0
- cffi=1.15.1=py38h6c40b1e_3
- comm=0.1.2=py38hecd8cb5_0
- decorator=5.1.1=pyhd3eb1b0_0
- defusedxml=0.7.1=pyhd3eb1b0_0
- entrypoints=0.4=py38hecd8cb5_0
- flit-core=3.8.0=py38hecd8cb5_0
- icu=58.2=h0a44026_3
- idna=3.4=py38hecd8cb5_0
- importlib-metadata=6.0.0=py38hecd8cb5_0
- importlib_metadata=6.0.0=hd3eb1b0_0
- importlib_resources=5.2.0=pyhd3eb1b0_1
- ipython_genutils=0.2.0=pyhd3eb1b0_1
- jinja2=3.1.2=py38hecd8cb5_0
- json5=0.9.6=pyhd3eb1b0_0
- jsonschema=4.17.3=py38hecd8cb5_0
- jupyter_client=8.1.0=py38hecd8cb5_0
- jupyter_core=5.3.0=py38hecd8cb5_0
- jupyter_events=0.6.3=py38hecd8cb5_0
- jupyter_server=1.23.4=py38hecd8cb5_0
- jupyter_server_fileid=0.9.0=py38hecd8cb5_0
- jupyter_server_ydoc=0.8.0=py38hecd8cb5_1
- jupyter_ydoc=0.2.4=py38hecd8cb5_0
- jupyterlab=3.6.3=py38hecd8cb5_0
- jupyterlab_pygments=0.1.2=py_0
- jupyterlab_server=2.22.0=py38hecd8cb5_0
- libcxx=14.0.6=h9765a3e_0
- libffi=3.4.2=hecd8cb5_6
- libiconv=1.16=hca72f7f_2
- libsodium=1.0.18=h1de35cc_0
- libxml2=2.10.3=h930c0e2_0
- libxslt=1.1.37=h6d1eb0e_0
- lxml=4.9.2=py38h6c40b1e_0
- matplotlib-inline=0.1.6=py38hecd8cb5_0
- ncurses=6.4=hcec6c5f_0
- nest-asyncio=1.5.6=py38hecd8cb5_0
- pocket book=6.5.3=py38hecd8cb5_0
- notebook-shim=0.2.2=py38hecd8cb5_0
- openssl=1.1.1u=hca72f7f_0
- packaging=23.0=py38hecd8cb5_0
- pandocfilters=1.5.0=pyhd3eb1b0_0
- parso=0.8.3=pyhd3eb1b0_0
- pexpect=4.8.0=pyhd3eb1b0_3
- pickleshare=0.7.5=pyhd3eb1b0_1003
- pip=22.3.1=py38hecd8cb5_0
- pkgutil-resolve-name=1.3.10=py38hecd8cb5_0
- prometheus_client=0.14.1=py38hecd8cb5_0
- ptyprocess=0.7.0=pyhd3eb1b0_2
- pure_eval=0.2.2=pyhd3eb1b0_0
- pycparser=2.21=pyhd3eb1b0_0
- pyopenssl=23.0.0=py38hecd8cb5_0
- pysocks=1.7.1=py38_1
- python=3.8.16=h218abb5_3
- python-dateutil=2.8.2=pyhd3eb1b0_0
- python-fastjsonschema=2.16.2=py38hecd8cb5_0
- python-json-logger=2.0.7=py38hecd8cb5_0
- pyyaml=6.0=py38h6c40b1e_1
- readline=8.2=hca72f7f_0
- rfc3339-validator=0.1.4=py38hecd8cb5_0
- rfc3986-validator=0.1.1=py38hecd8cb5_0
- send2trash=1.8.0=pyhd3eb1b0_1
- setuptools=65.6.3=py38hecd8cb5_0
- six=1.16.0=pyhd3eb1b0_1
- soupsieve=2.4=py38hecd8cb5_0
- sqlite=3.40.1=h880c91c_0
- stack_data=0.2.0=pyhd3eb1b0_0
- terminado=0.17.1=py38hecd8cb5_0
- tinycss2=1.2.1=py38hecd8cb5_0
- tk=8.6.12=h5d9f67b_0
- tomli=2.0.1=py38hecd8cb5_0
- twister=6.2=py38hca72f7f_0
- typing_extensions=4.4.0=py38hecd8cb5_0
- wheel=0.37.1=pyhd3eb1b0_0
- xz=5.2.10=h6c40b1e_1
- y-py=0.5.9=py38h7242b5c_0
- yaml=0.2.5=haf1e3a3_0
- ypy-websocket=0.8.2=py38hecd8cb5_0
- zeromq=4.3.4=h23ab428_0
- zlib=1.2.13=h4dc903c_0
- pip:
- alembic==1.10.2
- anyio==3.6.2
- appnope==0.1.3
- arrow==1.2.3
- asn1crypto==1.5.1
- asttokens==2.2.1
- async-generator==1.10
- attrs==22.2.0
- beautifulsoup4==4.11.2
- bleach==6.0.0
- cachetools==4.2.2
- certipy==0.1.3
- charset-normalizer==2.1.1
- cloudpickle==2.0.0
- cmaes==0.9.1
- colorlog==6.7.0
- contourpy==1.0.7
- cryptography==39.0.2
- cycler==0.11.0
- debugpy==1.6.6
- executing==1.2.0
- fastjsonschema==2.16.3
- filelock==3.9.0
- fonttools==4.39.0
- fqdn==1.5.1
- greenlet==2.0.2
- imbalanced-learn==0.10.1
- importlib-resources==5.12.0
- ipykernel==6.21.3
- ipython==8.11.0
- ipywidgets==8.0.4
- isoduration==20.11.0
- jedi==0.18.2
- joblib==1.2.0
- jsonpointer==2.3
- jupyter==1.0.0
- jupyter-client==8.0.3
- jupyter-console==6.6.3
- jupyter-core==5.2.0
- jupyter-server==2.4.0
- jupyter-server-terminals==0.4.4
- jupyter-telemetry==0.1.0
- jupyterhub==4.0.0
- jupyterlab-pygments==0.2.2
- jupyterlab-widgets==3.0.5
- kiwisolver==1.4.4
- lightgbm==3.2.1
- llvmlite==0.40.1rc1
- mako==1.2.4
- markupsafe==2.1.2
- matplotlib==3.7.1
- mistune==2.0.5
- nbclassic==0.5.3
- nbclient==0.7.2
- nbconvert==7.2.9
- nbformat==5.7.3
- numba==0.57.0
- numpy==1.22.3
- oauthlib==3.2.2
- optuna==3.1.0
- oscrypto==1.3.0
- pamela==1.1.0
- pandas==1.4.3
- pillow==9.4.0
- platformdirs==3.1.0
- prometheus-client==0.16.0
- prompt-toolkit==3.0.38
- psutil==5.9.4
- pyarrow==10.0.1
- pycryptodomex==3.17
- pygments==2.14.0
- pyjwt==2.6.0
- pyparsing==3.0.9
- pyrsistent==0.19.3
- pytz==2022.7.1
- pyzmq==25.0.0
- qtconsole==5.4.0
- qtpy==2.3.0
- requests==2.28.2
- ruamel-yaml==0.17.31
- ruamel-yaml-clib==0.2.7
- scikit-learn==1.1.1
- scipy==1.7.1
- seaborn==0.11.2
- sniffio==1.3.0
- snowflake==0.0.3
- snowflake-connector-python==3.0.1
- snowflake-snowpark-python==0.10.0
- sqlalchemy==2.0.5.post1
- stack-data==0.6.2
- threadpoolctl==3.1.0
- tqdm==4.65.0
- traitlets==5.9.0
- typing-extensions==4.5.0
- uri-template==1.2.0
- urllib3==1.26.14
- wcwidth==0.2.6
- webcolors==1.12
- webencodings==0.5.1
- websocket-client==1.5.1
- widgetsnbextension==4.0.5
- xgboost==1.5.0
- zipp==3.15.0

Öffnen Sie als Nächstes ein Befehlszeilenterminal und geben Sie Folgendes aus demselben Ordner ein, in dem Sie die Datei „atmosphere.yml“ erstellt haben

conda create conda env create -f pysnowpark_ml.yml

Dann aktivieren Sie Ihre Umgebung

conda activate pysnowpark_ml

Und schließlich starten Sie Ihr Jupyter-Pocket book

jupyter pocket book

Hinweis: Wenn Sie Anaconda nicht haben, können Sie es herunterladen, indem Sie den folgenden Anweisungen folgen

Als nächstes starten Sie Ihre Jupyter-Pocket book-Umgebung

Der einfachste Weg, dies zu tun, besteht darin, Anaconda herunterzuladen Hierinstallieren und öffnen Sie es und klicken Sie dann auf die Jupyter Pocket book-Kachel

Zwei direkt von zu Hause aus sehen? Dieses Dropdown-Menü wählt Ihre Umgebung aus, in diesem Fall pysnowpark_ml

Dadurch sollte ein Blatt entstehen, das etwa so aussieht:

Klicken Sie dann wie folgt auf die Schaltfläche „Neu“ und wählen Sie ein Python3-Notizbuch aus

Was Sie hierher bringt

Als nächstes kopieren Sie diese Zellen und führen sie der Reihe nach aus

from snowflake.snowpark.session import Session
from snowflake.snowpark.capabilities import sproc
import snowflake.snowpark.capabilities as F
import snowflake.snowpark.sorts as T
import pandas as pd
import json
import os
import sys
from sklearn.linear_model import LogisticRegression
from cachetools import cached
snowflake_connection_cfg = json.masses(open("creds.json").learn())
session = Session.builder.configs(snowflake_connection_cfg).create()
session.sql("CREATE OR REPLACE WAREHOUSE VB_VH WITH WAREHOUSE_SIZE='X-SMALL'").gather()
session.sql("CREATE OR REPLACE DATABASE VB_DB").gather()
session.sql("CREATE OR REPLACE STAGE ML_MODELS").gather()
from sklearn.datasets import make_classification
import pandas as pd
columns = [str(i) for i in range(0,10)]
X,y = make_classification(n_samples=100000, n_features=10, n_classes=2)
df = pd.DataFrame(X, columns=columns)
feature_cols = df.columns
df['LOAN_DEFAULT'] = y
session.write_pandas(df, table_name='LOAN_DATASET', auto_create_table=True, overwrite=True)
@sproc(session=session, title='get_scores_sf', stage_location='@ML_MODELS',  
packages=['snowflake-snowpark-python', 'scikit-learn', 'numpy'],
is_permanent=True,
change=True)
def train_model(session: Session, train_table: str, feature_cols: checklist, target_col: str, model_name: str) -> str:
from sklearn.linear_model import LogisticRegression
from joblib import dump
local_training_data = session.desk(train_table).to_pandas()
X,y = local_training_data[feature_cols], local_training_data[target_col]
lrmodel = LogisticRegression().match(X, y)
dump(lrmodel, '/tmp/'+model_name)
session.file.put('/tmp/'+model_name, '@ML_MODELS', auto_compress=False, overwrite=True)
return('ML Mannequin educated and saved')

train_model("LOAN_DATASET", checklist(feature_cols), 'LOAN_DEFAULT', 'lr_model.sav')

@cached(cache={})
def load_model(model_path: str) -> object:
from joblib import load
mannequin = load(model_path)
return mannequin

def udf_model(df: pd.DataFrame) -> pd.Sequence:
mannequin = load_model(sys._xoptions["snowflake_import_directory"]+'lr_model.sav')
scored_data = pd.Sequence(mannequin.predict(df))
return scored_data

udf_model = session.udf.register(session=session,func=udf_model, title="udf_score_lr_model", stage_location='@ML_MODELS',
input_types=[T.FloatType()]*len(feature_cols),
return_type=T.FloatType(),
change=True, is_permanent=True,
max_batch_size=1000,
imports=['@ML_MODELS/lr_model.sav'],
packages=['scikit-learn==1.1.1','pandas','joblib','cachetools'])

test_sdf = session.desk('LOAN_DATASET')
test_sdf.with_column('DEFAULT_PREDICTION', udf_model(*feature_cols)).to_pandas()

Was zu so etwas führen sollte

Beachten Sie, dass ich die Unterüberschriften mit Markdown hinzugefügt habe. Sie sind nicht notwendig, sondern rein ästhetisch

Das wird im Großen und Ganzen gleich aussehen, aber natürlich wird es einige Optimierungen geben, die die unterschiedliche IDE widerspiegeln

Melden Sie sich zunächst bei Snowflake an

Als nächstes erstellen Sie ein Python-Arbeitsblatt

Wählen Sie als Nächstes ein virtuelles Warehouse und eine Datenbank aus

Kopieren Sie als Nächstes diesen Code in das Blatt

Stellen Sie als Nächstes sicher, dass Ihre Abhängigkeitsbibliotheken importiert sind

Nächstes Ausführen



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here