TensorFlow ir PyTorch: ML framework palyginimas

Amžinoji dilema: kuris framework’as vertas tavo dėmesio?

Jei dirbi su mašininiu mokymusi arba tik planuoji įsitraukti į šią sritį, greičiausiai jau girdėjai apie du didžiulius žaidėjus – TensorFlow ir PyTorch. Šie framework’ai tapo tarsi Coca-Cola ir Pepsi pasaulyje: abu daro panašius dalykus, bet žmonės turi aiškias preferencijas ir kartais net ginčijasi, kuris geresnis.

Tiesą sakant, pasirinkimas nėra toks paprastas kaip „vienas geras, kitas blogas”. Kiekvienas iš šių framework’ų turi savo stipriąsias puses, silpnybes ir idealias naudojimo situacijas. Aš pats esu dirbęs su abiem, ir galiu pasakyti – sprendimas labai priklauso nuo to, ką konkrečiai nori pasiekti.

Istorija ir filosofija: kaip viskas prasidėjo

TensorFlow atsirado 2015 metais kaip Google Brain komandos kūrinys. Nuo pat pradžių jis buvo sukurtas su produkcija galvoje – Google norėjo framework’ą, kuris veiktų ne tik mokslininko laptope, bet ir milžiniškose serverių fermose. Tai matyti iš visos architektūros: statiniai grafai, optimizacija, deployment’o galimybės.

PyTorch, palyginti, atsirado 2016-aisiais iš Facebook’o (dabar Meta) AI Research laboratorijos. Jų filosofija buvo visiškai kitokia – padaryti framework’ą, kuris būtų intuityvus, pythoniškas ir puikiai tiktų eksperimentams. Jie norėjo, kad mokslininkai galėtų greitai testuoti idėjas, o ne kovoti su sudėtinga infrastruktūra.

Įdomu tai, kad abi komandos žiūrėjo į savo konkurentus ir mokėsi. TensorFlow 2.0 versija, išleista 2019-aisiais, buvo milžiniškas žingsnis link paprastumo ir eager execution (dinaminio vykdymo), o PyTorch pradėjo daugiau dėmesio skirti produkcijos galimybėms su TorchScript ir TorchServe.

Sintaksė ir darbo patirtis: kur slypi tikrasis skirtumas

Čia prasideda įdomiausia dalis. Jei kada nors rašei kodą abiem framework’ais, žinai, kad jausmas yra visiškai skirtingas.

PyTorch sintaksė jaučiasi kaip natūrali Python kalbos dalis. Kai rašai kodą, jis veikia taip, kaip tikėtumeis. Noriu sukurti paprastą neuronų tinklą? Štai kaip tai atrodo:


import torch.nn as nn

class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)

def forward(self, x):
x = torch.relu(self.fc1(x))
return self.fc2(x)

Tai paprasta, skaitoma ir intuityvus. Forward metodas tiesiog aprašo, kas vyksta su duomenimis – jokių keistenybių.

TensorFlow, ypač senesnėse versijose, buvo gerokai sudėtingesnis. Turėjai apibrėžti grafą, tada jį vykdyti sesijoje… Bet TensorFlow 2.0 viską pakeitė. Dabar su Keras API (kuris tapo standartiniu TensorFlow būdu) kodas atrodo taip:


from tensorflow import keras

model = keras.Sequential([
keras.layers.Dense(128, activation='relu', input_shape=(784,)),
keras.layers.Dense(10)
])

Tai daug paprasčiau nei anksčiau, bet vis tiek jaučiasi šiek tiek kitaip nei PyTorch. Keras yra labiau high-level, o tai reiškia, kad greičiau pradėsi, bet kartais gali pasijusti apribotas, kai nori kažko nestandartinio.

Debugging’as: kai kažkas nueina ne taip

Čia PyTorch tikrai švyti. Kadangi jis naudoja dinaminį skaičiavimo grafą (dynamic computational graph), gali naudoti įprastus Python debugging įrankius. Įdėk `print()` statement’ą, naudok `pdb` debugger’į, žiūrėk tensor’ių reikšmes bet kuriuo momentu – viskas veikia taip, kaip tikėtumeis.

Su TensorFlow, ypač senesnėmis versijomis, debugging’as buvo tikras košmaras. Turėjai vykdyti visą grafą, kad pamatytum, kas vyksta. TensorFlow 2.0 su eager execution šią problemą išsprendė, bet vis tiek kai kurie dalykai jaučiasi ne tokie sklandūs kaip PyTorch.

Praktinis patarimas: jei esi pradedantysis arba dirbi su daug eksperimentų reikalaujančiu projektu, PyTorch debugging patirtis tau sutaupys daug nervų ir laiko. Tikrai.

Deployment’as ir produkcija: kur TensorFlow vis dar stiprus

Gerai, PyTorch yra nuostabus moksliniams tyrimams, bet kas nutinka, kai nori savo modelį paleisti gamyboje? Čia TensorFlow vis dar turi pranašumų, nors atotrūkis mažėja.

TensorFlow Serving yra brandus, patikimas sprendimas modelių deployment’ui. TensorFlow Lite puikiai veikia mobiliuose įrenginiuose. TensorFlow.js leidžia paleisti modelius tiesiog naršyklėje. Visa ekosistema yra gerai apgalvota ir integruota.

PyTorch šioje srityje ilgai atsiliko, bet dabar situacija keičiasi. TorchServe suteikia panašias galimybes kaip TensorFlow Serving. PyTorch Mobile veikia iOS ir Android platformose. TorchScript leidžia optimizuoti modelius produkcijai.

Tačiau jei dirbi didelėje organizacijoje, kur jau yra sukurta infrastruktūra su TensorFlow, greičiausiai turėsi daugiau palaikymo ir dokumentacijos. Google Cloud Platform, pavyzdžiui, turi puikią TensorFlow integraciją.

Bendruomenė ir mokymosi ištekliai

Abi platformos turi milžiniškas bendruomenes, bet jos šiek tiek skiriasi charakteriu.

TensorFlow bendruomenė yra didesnė skaičiais – juk jis atsirado anksčiau ir turi Google paramą. Rasi daugiau tutorial’ų, Stack Overflow atsakymų ir ready-made sprendimų. Bet kartais ši informacija yra pasenusi arba skirta TensorFlow 1.x versijai, kas gali gluminti.

PyTorch bendruomenė yra labai aktyvi akademiniame pasaulyje. Jei skaitai naujausius mašininio mokymosi tyrimus, pastebėsi, kad daugelis jų naudoja PyTorch. Fast.ai kursai, kurie yra vieni geriausių pradedantiesiems, sukurti ant PyTorch. Bendruomenė jaučiasi šiek tiek artimesnė ir draugiškesnė.

Praktiškai kalbant: jei mokaisi savarankiškai, PyTorch dokumentacija ir tutorial’ai yra geresni ir šiuolaikiškesni. TensorFlow dokumentacija kartais jaučiasi fragmentiška, ypač kai bando aprėpti ir seną, ir naują API.

Performance’as ir optimizacija

Čia reikalai tampa įdomūs. Teoriškai TensorFlow turėtų būti greitesnis dėl statinio grafo optimizacijų, bet praktikoje skirtumas dažnai yra minimalus arba priklauso nuo konkretaus use case’o.

PyTorch 2.0 pristatė `torch.compile()`, kuris naudoja naują kompiliatorių ir gali suteikti rimtą performance boost’ą. Kai kuriuose benchmark’uose jis netgi lenkia TensorFlow.

TensorFlow turi XLA (Accelerated Linear Algebra) kompiliatorių, kuris gali optimizuoti modelius įvairioms aparatinėms platformoms. Tai stipri pusė, ypač jei dirbi su TPU (Tensor Processing Units).

Reali tiesa: daugeliui projektų performance skirtumas tarp šių framework’ų nėra kritinis. Dažniau bottleneck’ai būna duomenų pipeline’uose, modelio architektūroje ar aparatinėje įrangoje, o ne framework’o pasirinkime.

Konkrečios rekomendacijos: kada ką rinktis

Gerai, užteks teorijos. Štai mano rekomendacijos pagal skirtingas situacijas:

Rinkis PyTorch, jei:

  • Esi pradedantysis ir nori greitai išmokti
  • Dirbi su moksliniais tyrimais ar akademine veikla
  • Tau svarbu greitas prototipavimas ir eksperimentavimas
  • Nori intuityvaus, pythoniško kodo
  • Dirbi su computer vision projektais (torchvision yra puikus)
  • Planuoji dažnai debug’inti ir tyrinėti modelio vidų

Rinkis TensorFlow, jei:

  • Tau svarbus greitas deployment’as į produkciją
  • Dirbi su mobiliomis aplikacijomis ar edge devices
  • Nori paleisti modelius naršyklėje
  • Tavo organizacija jau naudoja TensorFlow infrastruktūrą
  • Dirbi su TPU arba Google Cloud Platform
  • Reikia brandaus, stabilaus sprendimo su ilgalaikiu palaikymu

Praktinis patarimas: jei nežinai, ką rinktis, pradėk nuo PyTorch. Jis paprastesnis mokytis, ir vėliau perėjimas į TensorFlow (jei prireiks) bus gana sklandus, nes pagrindinės koncepcijos yra tos pačios.

Ateities perspektyvos: kur judame?

Įdomu stebėti, kaip abu framework’ai konverguoja. TensorFlow tapo paprastesnis ir pythoniškesnis. PyTorch įgavo geresnį produkcijos palaikymą. Atotrūkis tarp jų mažėja.

PyTorch momentum’as akademiniame pasaulyje yra neginčijamas. Jei žiūri į CVPR, NeurIPS ar kitas dideles konferencijas, daugelis tyrimų naudoja PyTorch. Tai reiškia, kad naujos idėjos ir metodai dažnai pirmiausia atsiranda PyTorch implementacijose.

TensorFlow, kita vertus, išlaiko stiprią poziciją industrijoje. Google investuoja didžiulius resursus į jo plėtrą, o TPU hardware’as yra optimizuotas būtent TensorFlow. Jei dirbi su didelės apimties production sistemomis, TensorFlow ekosistema vis dar turi pranašumų.

Įdomus dalykas: atsiranda vis daugiau įrankių, kurie leidžia konvertuoti modelius tarp framework’ų. ONNX (Open Neural Network Exchange) formatas tampa populiaresnis. Tai reiškia, kad ateityje pasirinkimas gali būti mažiau kritinis – galėsi treniruoti vienoje platformoje ir deploy’inti kitoje.

Mano nuomone, abu framework’ai išliks svarbūs artimiausiais metais. Konkurencija tarp jų yra sveika ir skatina inovacijas. Kaip ML inžinierius ar data scientist, verta pažinti abu – tai padidins tavo vertę darbo rinkoje ir suteiks daugiau lankstumo projektuose.

Galiausiai, nesvarbu, kurį pasirinki – svarbu pradėti. Geriau gerai mokėti vieną framework’ą nei paviršutiniškai žinoti abu. Pasirink vieną, pasigilink jame, sukurk realių projektų. Vėliau, jei prireiks, išmoksi ir kitą. Pagrindinės mašininio mokymosi koncepcijos yra tos pačios, skiriasi tik sintaksė ir tooling’as.

Daugiau

Deno KV: built-in database