Pipeline-putkiston tallentaminen ja lataaminen joblibillä
Oppijat serialisoivat sovitetun Pipeline-putkiston levylle komennolla joblib.dump ja lataavat sen uuteen Python-istuntoon ennusteiden tekemistä varten ilman uudelleenkoulutusta.
Pipeline-putkiston tallentaminen ja lataaminen joblibillä on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Miksi opetettu putki kannattaa säilyttää?
Koneoppimisputken opettaminen voi kestää minuutteja tai tunteja. Kun putki on sovitettu, haluat tallentaa sen levylle, jotta voit ladata sen myöhemmin ennusteita varten ilman uudelleenopetusta. Säilytys on olennaista myös käyttöönotossa: opetat mallin kehityskoneella ja tuotat ennusteita tuotantopalvelimella. Tallennetun tiedoston on sisällettävä sekä esikäsittelyvaiheet että mallin painot.
Kaksi sarjallistamisvaihtoehtoa: pickle ja joblib
Pythonin sisäänrakennettu pickle-moduuli voi sarjallistaa minkä tahansa Python-objektin, myös sklearn-putket. joblib on kolmannen osapuolen kirjasto (joka toimitetaan scikit-learnin mukana), jota yleensä suositellaan koneoppimisobjekteille, koska se on tehokkaampi suurten NumPy-taulukoiden kanssa — se käyttää muistikuvausta kopioinnin sijaan — ja voi pakata tulostiedoston automaattisesti.
import pickle
import joblib
# Both approaches work; joblib is recommended for sklearn objects
print('pickle version:', pickle.HIGHEST_PROTOCOL)
import sklearn
print('sklearn version:', sklearn.__version__)Tallentaminen joblib.dump-funktiolla
joblib.dump(obj, filename) sarjallistaa putken tiedostoon. Voit halutessasi asettaa compress=3 käyttääksesi zlib-pakkausta (tasot 1–9; taso 3 tasapainottaa nopeuden ja koon). Funktio palauttaa luotujen tiedostojen luettelon. Useimmista putkista luodaan yksi .pkl- tai .joblib-tiedosto.
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(C=1.0, max_iter=200))
])
pipe.fit(X, y)
# Save
joblib.dump(pipe, '/tmp/iris_pipeline.joblib')
print('Pipeline saved!')Lataaminen joblib.load-funktiolla
joblib.load(filename) desarjallistaa putken takaisin Python-objektiksi. Ladattu putki on alkuperäisen kaltainen: siinä ovat samat sovitetut skaalainparametrit (keskiarvo ja varianssi) sekä samat mallin painot. Voit kutsua heti metodeja predict, predict_proba tai score ilman uudelleensovitusta.
import joblib
from sklearn.datasets import load_iris
import numpy as np
X, y = load_iris(return_X_y=True)
# Load the saved pipeline
loaded_pipe = joblib.load('/tmp/iris_pipeline.joblib')
# Predict and verify
predictions = loaded_pipe.predict(X[:5])
print('Predictions:', predictions)
print('Test accuracy:', loaded_pipe.score(X, y).round(4))Edestakaisen muunnoksen yhdenmukaisuuden varmistaminen
Varmista lataamisen jälkeen, että ladattu putki tuottaa täsmälleen samat ennusteet kuin alkuperäinen. Erot tarkoittavat sarjallistamisvirhettä tai versioiden yhteensopimattomuutta. Yksinkertainen tarkistus on verrata ennusteita alkio kerrallaan käyttämällä np.array_equal-funktiota.
import joblib
import numpy as np
from sklearn.datasets import load_iris
X, _ = load_iris(return_X_y=True)
# Reload and compare
loaded = joblib.load('/tmp/iris_pipeline.joblib')
# Reload the original reference predictions
# (in practice, save original predictions before reload)
original_preds = loaded.predict(X) # use loaded as reference
loaded2 = joblib.load('/tmp/iris_pipeline.joblib')
reloaded_preds = loaded2.predict(X)
print('Predictions match:', np.array_equal(original_preds, reloaded_preds))Pakkausvaihtoehdot joblibissä
Suuret putket (esimerkiksi 1 000 puun RandomForest) voivat viedä satoja megatavuja. Pakkaa tiedot lennossa käyttämällä joblib.dump(pipe, path, compress=3)-kutsua. Voit vaihtoehtoisesti määrittää pakkaajan nimenomaisesti: compress=('zlib', 3) tai compress=('lz4', 1) parhaan nopeuden saavuttamiseksi. LZ4 on nopein; zlib tuottaa pienempiä tiedostoja, mutta on hitaampi.
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
import os
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())]).fit(X, y)
# Uncompressed
joblib.dump(pipe, '/tmp/pipe_raw.joblib')
# Compressed
joblib.dump(pipe, '/tmp/pipe_compressed.joblib', compress=3)
print('Raw size:', os.path.getsize('/tmp/pipe_raw.joblib'), 'bytes')
print('Compressed size:', os.path.getsize('/tmp/pipe_compressed.joblib'), 'bytes')Picklen käyttäminen vaihtoehtona
Jos joblib ei ole käytettävissä, pickle toimii sklearn-putkien kanssa. Käytä tiedostoa avatessasi binaaritilaa ('rb'/'wb'). Pienille malleille tai kertaluonteisille skriptatuille työkaluille pickle sopii hyvin; suuria NumPy-taulukoita käsittelevissä tuotantojärjestelmissä joblibiä suositellaan vahvasti.
import pickle
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
pipe = Pipeline([('sc', StandardScaler()), ('lr', LogisticRegression())]).fit(X, y)
# Save with pickle
with open('/tmp/model.pkl', 'wb') as f:
pickle.dump(pipe, f)
# Load with pickle
with open('/tmp/model.pkl', 'rb') as f:
loaded = pickle.load(f)
print('Loaded score:', loaded.score(X, y).round(4))Varoitukset versioiden yhteensopivuudesta
Tuotannossa on otettava huomioon tärkeä seikka: scikit-learnin versiolla 1.2 pickle-tiedostoksi tallennettu putki ei välttämättä lataudu oikein scikit-learnin versiolla 1.5. Kirjaa aina opetushetkellä käytetyt kirjastoversiot metatiedostoon tallennetun mallin yhteyteen. Käytä komentoa pip freeze > requirements.txt tai tallenna versiot ohjelmallisesti ja säilytä ne mallitiedoston vieressä.
import sklearn
import numpy as np
import json
import os
metadata = {
'sklearn_version': sklearn.__version__,
'numpy_version': np.__version__,
'model_file': 'iris_pipeline.joblib'
}
with open('/tmp/model_metadata.json', 'w') as f:
json.dump(metadata, f, indent=2)
print(json.dumps(metadata, indent=2))Pipelinen lataaminen tuotantoskriptissä
Tuotantopalvelussa työnkulku on seuraava: lataa putki kerran käynnistyksen yhteydessä (ei jokaisen pyynnön yhteydessä), vastaanota syötepiirteet, esikäsittele ne putken sisäisillä muunnoksilla ja palauta ennusteet. Koska putki sisältää kaiken esikäsittelyn, palvelukoodin ei tarvitse tietää skaalauksesta, koodauksesta tai PCA:sta — kaikki tämä on kapseloitu tallennettuun objektiin.
import joblib
import numpy as np
# At startup (once)
model = joblib.load('/tmp/iris_pipeline.joblib')
def predict(sepal_length, sepal_width, petal_length, petal_width):
features = np.array([[sepal_length, sepal_width, petal_length, petal_width]])
label = model.predict(features)[0]
proba = model.predict_proba(features)[0]
return {'label': int(label), 'confidence': round(float(proba.max()), 4)}
result = predict(5.1, 3.5, 1.4, 0.2)
print('Prediction result:', result)Pickle-mallien turvallisuusnäkökohdat
Älä koskaan lataa pickle-tiedostoa epäluotetusta lähteestä. Pickle-tiedostot voivat suorittaa ladattaessa mielivaltaista koodia — tämä on Pythonin perustavanlaatuinen turvallisuusrajoite. Kun jaat malleja ulkoisesti, harkitse formaattikohtaisia turvallisempia vaihtoehtoja: ONNX-formaattia eri frameworkien väliseen sarjallistamiseen tai joblib-tiedostoja, joita jaetaan vain luotetussa infrastruktuurissa. Tarkista aina tiedoston tarkistussumma ennen lataamista.
import hashlib
def file_sha256(path):
h = hashlib.sha256()
with open(path, 'rb') as f:
for chunk in iter(lambda: f.read(65536), b''):
h.update(chunk)
return h.hexdigest()
checksum = file_sha256('/tmp/iris_pipeline.joblib')
print('Model SHA-256:', checksum)
# In production: compare this checksum with the one stored in your model registryNopea lataus- ja ennustejärkevyystesti
Hyvä käytäntö on sisällyttää mallipakettiin lyhyt järkevyystestiskripti, joka lataa putken, suorittaa tunnetun syötteen ja varmistaa odotetun tuloksen. Suorita tämä testi CI/CD-putkessa aina, kun malli viedään tuotantoon, jotta voit varmistaa, ettei tiedosto ole vioittunut ja että ympäristö on yhteensopiva.
import joblib
import numpy as np
# Sanity test
model = joblib.load('/tmp/iris_pipeline.joblib')
# Known input (setosa): sepal_length=5.1, sepal_width=3.5, petal_length=1.4, petal_width=0.2
X_test = np.array([[5.1, 3.5, 1.4, 0.2]])
pred = model.predict(X_test)[0]
# Iris class 0 = setosa
assert pred == 0, f'Expected setosa (0) but got {pred}'
print('Sanity test PASSED — model predicts setosa correctly.')Pikatarkistus
Testaa tässä oppitunnissa oppimaasi putkien tallentamisesta ja lataamisesta.
Oppitunnin yhteenveto
Tässä oppitunnissa opitte, että joblib.dump ja joblib.load tallentavat kokonaisen sovitetun putken ja palauttavat sen kaikkine esikäsittelyparametreineen, että kirjastojen versiot on aina tallennettava mallin mukana, jotta lataaminen on toistettavissa, ja että pickle-tiedostoja ei saa koskaan ladata epäluotettavista lähteistä, koska ne voivat suorittaa mielivaltaista koodia. Seuraavaksi käsittelemme epätasapainoisia aineistoja: luokkien epätasapainon tunnistamista ja sen ymmärtämistä, miksi tarkkuus on tässä tilanteessa harhaanjohtava mittari.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Pipeline-putkiston tallentaminen ja lataaminen joblibillä” ilmainen?
Kyllä – oppitunnin ”Pipeline-putkiston tallentaminen ja lataaminen joblibillä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Pipeline-putkiston tallentaminen ja lataaminen joblibillä”?
Oppijat serialisoivat sovitetun Pipeline-putkiston levylle komennolla joblib.dump ja lataavat sen uuteen Python-istuntoon ennusteiden tekemistä varten ilman uudelleenkoulutusta. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Pipeline-putkiston tallentaminen ja lataaminen joblibillä”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?
Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Ensimmäisen Pipeline-putkiston rakentaminen: skaalaus ja luokittelu
- ColumnTransformer Pipeline-putkiston sisällä
- Koko Pipeline-putkiston ristivalidointi ja ruudukkohaku
- Pipeline-putkiston tallentaminen ja lataaminen joblibillä