diff --git a/.gitignore b/.gitignore index a1d21056b..eb5ff0074 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,4 @@ nbs/ __pycache__/ .cache/ +**/.ipynb_checkpoints/ diff --git a/chapters/te/_toctree.yml b/chapters/te/_toctree.yml index 301decc44..001b1d11c 100644 --- a/chapters/te/_toctree.yml +++ b/chapters/te/_toctree.yml @@ -26,4 +26,24 @@ title: సారాంశం - local: chapter1/11 title: పరీక్ష - quiz: 1 \ No newline at end of file + quiz: 1 +- title: 2. ట్రాన్స్‌ఫార్మర్లు ఉపయోగించడం + sections: + - local: chapter2/1 + title: పరిచయం + - local: chapter2/2 + title: పైప్‌లైన్ వెనుక + - local: chapter2/3 + title: మోడల్స్ + - local: chapter2/4 + title: టోకనైజర్లు + - local: chapter2/5 + title: బహుళ సీక్వెన్సుల నిర్వహణ + - local: chapter2/6 + title: అన్నింటినీ కలిపి + - local: chapter2/7 + title: ప్రాథమిక వినియోగం పూర్తయింది! + - local: chapter2/8 + title: ఆప్టిమైజ్డ్ ఇన్ఫరెన్స్ డిప్లాయ్‌మెంట్ + - local: chapter2/9 + title: అధ్యాయం ముగింపు క్విజ్ \ No newline at end of file diff --git a/chapters/te/chapter2/1.mdx b/chapters/te/chapter2/1.mdx new file mode 100644 index 000000000..6beddd7b3 --- /dev/null +++ b/chapters/te/chapter2/1.mdx @@ -0,0 +1,24 @@ +# పరిచయం + + + +మీరు [అధ్యాయం 1](/course/chapter1) లో చూసినట్లుగా, Transformer మోడళ్లు సాధారణంగా చాలా పెద్దవిగా ఉంటాయి. లక్షల నుండి *బిలియన్ల* వరకు పరామితులు ఉండటం వల్ల, ఈ మోడళ్లను శిక్షణ ఇవ్వడం మరియు అమలు చేయడం ఒక క్లిష్టమైన పని. అంతేకాకుండా, కొత్త మోడళ్లు దాదాపు ప్రతిరోజూ విడుదల అవుతుండటంతో మరియు ప్రతి మోడల్‌కు స్వంత అమలు ఉండటంతో, వాటిని అన్నింటినీ ప్రయత్నించడం అంత తేలిక కాదు. + +ఈ సమస్యను పరిష్కరించడానికి 🤗 Transformers లైబ్రరీ రూపొందించబడింది. దీని లక్ష్యం ఏ Transformer మోడల్‌నైనా ఒకే API ద్వారా లోడ్ చేయడం, శిక్షణ ఇవ్వడం, మరియు భద్రపరచడం సాధ్యమయ్యేలా చేయడం. ఈ లైబ్రరీ యొక్క ముఖ్య లక్షణాలు ఇవి: + +- **వాడుకలో సులభత**: అత్యాధునిక NLP మోడల్‌ను inference కోసం download చేసి, లోడ్ చేసి, ఉపయోగించడం కేవలం రెండు పంక్తుల కోడ్‌తో చేయవచ్చు. +- **అనుకూలత**: లోతుగా చూస్తే అన్ని మోడళ్లు సాధారణ PyTorch `nn.Module` తరగతులు మాత్రమే, కాబట్టి వాటిని వారి ML frameworkలలోని ఇతర మోడళ్లలాగే ఉపయోగించవచ్చు. +- **సరళత**: లైబ్రరీ అంతటా తక్కువ abstractions మాత్రమే ఉన్నాయి. "అన్నీ ఒకే ఫైల్‌లో" అనే భావన ఇక్కడ ప్రధానమైనది: ఒక మోడల్ యొక్క forward pass మొత్తం ఒకే ఫైల్‌లో నిర్వచించబడుతుంది, కాబట్టి కోడ్ సులభంగా అర్థమవుతుంది మరియు మార్చుకోవచ్చు. + +ఈ చివరి లక్షణం 🤗 Transformers ను ఇతర ML లైబ్రరీలతో పోలిస్తే కొంచెం భిన్నంగా ఉంచుతుంది. మోడళ్లు వేర్వేరు ఫైళ్లలో పంచుకున్న modules ఆధారంగా కాకుండా, ప్రతి మోడల్ తనకంటూ ప్రత్యేకమైన పొరలను (layers) కలిగి ఉంటుంది. దీని వలన మోడళ్లు మరింత సులభంగా అర్థమవుతాయి, అలాగే ఒక మోడల్‌పై ప్రయోగాలు చేయడం వలన ఇతర మోడళ్లపై ప్రభావం ఉండదు. + +ఈ అధ్యాయం ఒక end-to-end ఉదాహరణతో ప్రారంభమవుతుంది, ఇందులో మనం ఒక model మరియు tokenizer ను కలిపి [అధ్యాయం 1](/course/chapter1) లో పరిచయం చేసిన `pipeline()` function ను పునరావృతం చేస్తాము. తర్వాత మనం model API గురించి చర్చిస్తాము: model మరియు configuration classes లోకి వెళ్లి, ఒక మోడల్‌ను ఎలా లోడ్ చేయాలో, అది సంఖ్యా inputs ను తీసుకుని ఎలా ఫలితాలను ఇస్తుందో చూస్తాము. + +తర్వాత మనం tokenizer API ను పరిశీలిస్తాము, ఇది `pipeline()` function యొక్క మరో ముఖ్యమైన భాగం. Tokenizers మొదటి మరియు చివరి ప్రాసెసింగ్ దశలను చూసుకుంటాయి: text ను సంఖ్యా inputs గా మార్చడం, మరియు అవసరమైనప్పుడు ఫలితాలను తిరిగి text లోకి మార్చడం. చివరగా, ఒకే batch లోకి అనేక వాక్యాలను పంపడం ఎలా చేయాలో, మరియు high-level `tokenizer()` function ను దగ్గరగా పరిశీలిస్తాము. + + +⚠️ Model Hub మరియు 🤗 Transformers లో అందుబాటులో ఉన్న అన్ని ఫీచర్లను ఉపయోగించుకోవాలంటే, మేము ఒక ఖాతా సృష్టించుకోవాలని సిఫారసు చేస్తున్నాము. + diff --git a/chapters/te/chapter2/2.mdx b/chapters/te/chapter2/2.mdx new file mode 100644 index 000000000..b871ada22 --- /dev/null +++ b/chapters/te/chapter2/2.mdx @@ -0,0 +1,239 @@ + + +# పైప్‌లైన్ వెనుక + + + + + +ఇప్పుడు ఒక పూర్తి ఉదాహరణతో ప్రారంభిద్దాం. [అధ్యాయం 1](/course/chapter1)లో మనం క్రింది కోడ్‌ను నడిపినప్పుడు వెనుకపట్లో ఏమి జరిగిందో చూద్దాం: + +```python +from transformers import pipeline + +classifier = pipeline("sentiment-analysis") +classifier( + [ + "I've been waiting for a HuggingFace course my whole life.", + "I hate this so much!", + ] +) +``` + +మరియు మనకు వచ్చిన ఫలితాలు: + +```python out +[{'label': 'POSITIVE', 'score': 0.9598047137260437}, + {'label': 'NEGATIVE', 'score': 0.9994558095932007}] +``` + +[అధ్యాయం 1](/course/chapter1)లో చూశినట్లుగా, ఈ పైప్‌లైన్ మూడు దశలను కలిపి అమలు చేస్తుంది: ప్రీప్రాసెసింగ్, ఇన్‌పుట్‌లను మోడల్ ద్వారా పంపించడం, మరియు పోస్ట్‌ప్రాసెసింగ్: + +
+పూర్తి NLP పైప్‌లైన్: పాఠ్యాన్ని టోకనైజ్ చేయడం, IDs‌గా మార్చడం, మరియు ట్రాన్స్‌ఫార్మర్ మోడల్ ద్వారా ఇన్‌ఫరెన్స్ జరపడం. + +
+ +ఇప్పుడు ఈ దశలన్నింటినీ త్వరగా పరిశీలిద్దాం. + +## టోకనైజర్‌తో ప్రీప్రాసెసింగ్[[preprocessing-with-a-tokenizer]] + +ఇతర న్యూరల్ నెట్‌వర్క్‌ల మాదిరిగానే, Transformer మోడళ్లు రా టెక్స్ట్‌ను నేరుగా ప్రాసెస్ చేయలేవు. కాబట్టి పైప్‌లైన్‌లో మొదటి దశ పాఠ్యాన్ని మోడల్ అర్థం చేసుకునే సంఖ్యల్లోకి మార్చడం. దీని కోసం మనం *టోకనైజర్* ఉపయోగిస్తాము. ఇది కింది పనులకు బాధ్యత వహిస్తుంది: + +- ఇన్‌పుట్‌ను పదాలు, ఉపపదాలు లేదా చిహ్నాలు (ఉదాహరణకు, punctuation)గా విభజించడం — వీటిని *tokens* అని పిలుస్తారు +- ప్రతి టోకెన్‌ను ఒక integer కి మ్యాప్ చేయడం +- మోడల్‌కు ఉపయోగపడే అదనపు ఇన్‌పుట్‌లను జోడించడం + +ఈ ప్రీప్రాసెసింగ్ మొత్తం మోడల్‌ను ప్రీట్రెయిన్ చేసినప్పుడు ఎలా జరిగిందో అచ్చుగుద్దినట్లుగా జరగాలి. అందుకే ముందుగా ఆ సమాచారాన్ని [Model Hub](https://huggingface.co/models) నుండి డౌన్‌లోడ్ చేసుకోవాలి. దీని కోసం మనం `AutoTokenizer` క్లాస్ మరియు దాని `from_pretrained()` పద్ధతిని ఉపయోగిస్తాము. మన మోడల్ యొక్క checkpoint పేరును ఉపయోగించి, ఇది మోడల్ tokenizer కు సంబంధించిన డేటాను ఆటోమేటిక్‌గా తెచ్చి cache లో భద్రపరుస్తుంది (దాంతో మీరు క్రింది కోడ్‌ను మొదటిసారి నడిపినప్పుడు మాత్రమే అది డౌన్‌లోడ్ అవుతుంది). + +`sentiment-analysis` పైప్‌లైన్ యొక్క డిఫాల్ట్ checkpoint `distilbert-base-uncased-finetuned-sst-2-english` (దాని మోడల్ కార్డ్‌ను [ఇక్కడ](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english) చూడవచ్చు). కాబట్టి మనం ఈ క్రింది కోడ్‌ను నడుపుతాము: + +```python +from transformers import AutoTokenizer + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +``` + +టోకనైజర్ మనకు లభించిన తర్వాత, మనం వాక్యాలను నేరుగా దానిలోకి పంపవచ్చు, మరియు అది మోడల్‌కు ఇవ్వడానికి సిద్ధమైన dictionary ని తిరిగి ఇస్తుంది! ఇప్పుడు చేయవలసింది ఒక్కటే ఉంది: input IDs లిస్ట్‌ను tensors గా మార్చడం. + +🤗 Transformers ను ఉపయోగించినప్పుడు ఏ ML framework backend గా వాడబడుతుందో గురించి ఆందోళన చెందాల్సిన అవసరం లేదు; కొన్ని మోడళ్లకు అది PyTorch కావచ్చు లేదా Flax కావచ్చు. అయితే Transformer మోడళ్లు కేవలం *tensors* నే ఇన్‌పుట్‌గా స్వీకరిస్తాయి. మీరు tensors గురించి తొలిసారి వింటుంటే, వాటిని NumPy arrays మాదిరిగా ఊహించవచ్చు. NumPy array ఒక scalar (0D), ఒక vector (1D), ఒక matrix (2D), లేదా మరింత dimensions కలిగి ఉండవచ్చు. ఇవన్నీ tensors లాగానే పనిచేస్తాయి; ఇతర ML frameworks లోని tensors కూడా ఇలాగే ప్రవర్తిస్తాయి, మరియు సాధారణంగా NumPy arrays ను తయారు చేసినంత సులభంగానే వాటిని సృష్టించవచ్చు. + +మనకు తిరిగి రావలసిన tensor రకాన్ని (PyTorch లేదా సాధారణ NumPy) నిర్ణయించడానికి `return_tensors` argument ను ఉపయోగిస్తాము: + + +```python +raw_inputs = [ + "I've been waiting for a HuggingFace course my whole life.", + "I hate this so much!", +] +inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt") +print(inputs) +``` + +padding మరియు truncation గురించి ఇప్పుడే ఆందోళన చెందాల్సిన అవసరం లేదు; వాటిని తరువాత వివరిస్తాము. ఇక్కడ గుర్తుపెట్టుకోవలసిన ముఖ్యమైన విషయమేమిటంటే: మీరు ఒక వాక్యం లేదా వాక్యాల జాబితాను పంపవచ్చు, అలాగే మీరు కావలసిన tensor రకాన్ని సూచించవచ్చు (ఏ రకం సూచించకపోతే, ఫలితంగా lists of lists వస్తాయి). + +ఇక్కడ PyTorch tensors రూపంలో ఫలితాలు ఎలా ఉంటాయో చూడండి: + +```python out +{ + 'input_ids': tensor([ + [ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102], + [ 101, 1045, 5223, 2023, 2061, 2172, 999, 102, 0, 0, 0, 0, 0, 0, 0, 0] + ]), + 'attention_mask': tensor([ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] + ]) +} +``` + +ఆ అవుట్‌పుట్ dictionary లో రెండు keys ఉంటాయి: `input_ids` మరియు `attention_mask`. `input_ids`లో రెండు పంక్తుల integers ఉంటాయి (ప్రతి వాక్యానికి ఒక్కటి), ఇవి ప్రతి వాక్యంలో ఉన్న tokens కు ప్రత్యేకమైన గుర్తింపులు. `attention_mask` ఏమిటో ఈ అధ్యాయంలో తరువాత వివరిస్తాము. + +## మోడల్ ద్వారా పంపడం[[going-through-the-model]] + +ప్రీట్రెయిన్ చేసిన మోడల్‌ను కూడా మనం టోకనైజర్ మాదిరిగానే డౌన్‌లోడ్ చేసుకోవచ్చు. 🤗 Transformers లో `AutoModel` క్లాస్ ఉంది, దీనికి కూడా `from_pretrained()` పద్ధతి ఉంది: + +```python +from transformers import AutoModel + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +model = AutoModel.from_pretrained(checkpoint) +``` + +ఈ కోడ్ స్నిపెట్‌లో, మనం పైప్‌లైన్‌లో ముందే ఉపయోగించిన అదే checkpoint ను డౌన్‌లోడ్ చేసుకున్నాము (అది ఇప్పటికే cache లో ఉండాలి) మరియు దానితో ఒక model ను సృష్టించుకున్నాము. + +ఈ architecture కేవలం base Transformer మాడ్యూల్‌ను మాత్రమే కలిగి ఉంటుంది: కొన్ని ఇన్‌పుట్‌లు ఇచ్చినప్పుడు, ఇది *hidden states* (లేదా *features*) అని పిలిచే అవుట్‌పుట్‌లను ఇస్తుంది. ప్రతి మోడల్ ఇన్‌పుట్‌కు, Transformer మోడల్ దాని పై ఉన్న **contextual understanding** ను ప్రతిబింబించే ఒక high-dimensional వెక్టర్ లభిస్తుంది. + +ఇది ఇప్పుడే పూర్తిగా అర్థం కాకపోతే ఆందోళన చెందకండి. దీన్ని తరువాత విపులంగా వివరిస్తాము. + +ఈ hidden states కొన్ని సందర్భాల్లో ఉపయోగకరంగా ఉండవచ్చు, కానీ అవి సాధారణంగా మోడల్‌లోని మరో భాగానికి — *head* — కు ఇన్‌పుట్ అవుతాయి. [అధ్యాయం 1](/course/chapter1)లో చూశినట్లుగా, వేర్వేరు పనులు ఒకే architecture తో చేయవచ్చు, కానీ ప్రతి task కు వేర్వేరు head ఉంటుంది. + +### హై-డైమెన్షనల్ వెక్టర్?[[a-high-dimensional-vector]] + +Transformer module నుంచి వచ్చే వెక్టర్ సాధారణంగా పెద్దదే. దీనికి మూడు పరిమాణాలు ఉంటాయి: + +- **Batch size** (బ్యాచ్ పరిమాణం): ఒకేసారి ప్రాసెస్ చేసే సీక్వెన్స్‌ల సంఖ్య (మన ఉదాహరణలో 2). +- **Sequence length** (సీక్వెన్స్ పొడవు): ప్రతి సీక్వెన్స్‌కు సంబంధించిన సంఖ్యాత్మక ప్రతినిధి యొక్క పొడవు (మన ఉదాహరణలో 16). +- **Hidden size** (హిడెన్ పరిమాణం): ప్రతి ఇన్‌పుట్ టోకెన్‌కి మోడల్ ఉత్పత్తి చేసే వెక్టర్ యొక్క డైమెన్షన్. + +ఈ చివరి విలువ కారణంగా దీనిని "high dimensional" అంటారు. చిన్న మోడళ్లలో hidden size 768గా ఉంటుంది; పెద్ద మోడళ్లలో ఇది 3072 లేదా అంతకంటే ఎక్కువ కావచ్చు. + + +మనము ప్రీప్రాసెస్ చేసిన ఇన్‌పుట్‌లను మోడల్‌లోకి పంపితే ఇది స్పష్టంగా కనిపిస్తుంది: + +```python +outputs = model(**inputs) +print(outputs.last_hidden_state.shape) +``` + +```python out +torch.Size([2, 16, 768]) +``` + +🤗 Transformers మోడళ్ల అవుట్‌పుట్‌లు `namedtuple`s లేదా dictionaries లాగా ప్రవర్తిస్తాయి. మీరు వాటిని attributes ద్వారా (మనము చేసినట్లుగా), లేదా key (`outputs["last_hidden_state"]`), లేదా index ద్వారా (`outputs[0]`) కూడా యాక్సెస్ చేయవచ్చు. + +### మోడల్ హెడ్‌లు: సంఖ్యలకు అర్థం చెప్పడం[[model-heads-making-sense-out-of-numbers]] + +మోడల్ హెడ్‌లు hidden states అనే హై-డైమెన్షనల్ వెక్టర్లను తీసుకుని వాటిని వేరే డైమెన్షన్‌కి ప్రాజెక్ట్ చేస్తాయి. ఇవి సాధారణంగా ఒకటి లేదా కొన్ని లీనియర్ లేయర్‌లతో రూపొందుతాయి: + +
+Transformer నెట్‌వర్క్ మరియు దాని హెడ్. + +
+ +Transformer మోడల్ యొక్క అవుట్‌పుట్ నేరుగా మోడల్ హెడ్‌కు పంపబడుతుంది, అక్కడ అది ప్రాసెస్ చేయబడుతుంది. + +ఈ చిత్రంలో, మోడల్ తన embeddings layer మరియు దాని తర్వాతి లేయర్‌లతో చూపబడింది. Embeddings layer టోకనైజ్ చేసిన ఇన్‌పుట్‌లోని ప్రతి input ID ను, దానికి సరిపడే token ను ప్రతినిధ్యం చేసే ఒక వెక్టర్‌గా మారుస్తుంది. ఆ తర్వాతి లేయర్‌లు attention mechanism ను ఉపయోగించి ఆ వెక్టర్‌లను మార్చి, వాక్యాల యొక్క తుది ప్రతినిధిని తయారు చేస్తాయి. + +🤗 Transformers లో అనేక విభిన్న architectures ఉన్నాయి, ప్రతి ఒక్కటి ఒక నిర్దిష్ట పనిని పరిష్కరించడానికి రూపొంది ఉంటుంది. ఇవి కొన్ని ఉదాహరణలు: + +- `*Model` (hidden states ను పొందడానికి) +- `*ForCausalLM` +- `*ForMaskedLM` +- `*ForMultipleChoice` +- `*ForQuestionAnswering` +- `*ForSequenceClassification` +- `*ForTokenClassification` +- ఇంకా మరెన్నో 🤗 + +మన ఉదాహరణలో, వాక్యాలు positive లేదా negative అని వర్గీకరించడానికి sequence classification head కలిగిన మోడల్ అవసరం. అందువల్ల మనం `AutoModel` ను కాకుండా `AutoModelForSequenceClassification` ను ఉపయోగిస్తాము: + +```python +from transformers import AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) +outputs = model(**inputs) +``` + +ఇప్పుడు మనం అవుట్‌పుట్ యొక్క shape ను చూడగా, dimensionality చాలా తక్కువగా ఉంటుంది: మోడల్ హెడ్, ముందుగా చూసిన హై-డైమెన్షనల్ వెక్టర్లను తీసుకుని, ప్రతి లేబుల్‌కి ఒకటి చొప్పున రెండు విలువలను కలిగిన వెక్టర్లను ఉత్పత్తి చేస్తుంది: + +```python +print(outputs.logits.shape) +``` + +```python out +torch.Size([2, 2]) +``` + +మనకు రెండు వాక్యాలు మరియు రెండు లేబుల్స్ ఉన్నందున, మోడల్ ఇవ్వబడే ఫలితం 2 x 2 ఆకారంలో ఉంటుంది. + +## అవుట్‌పుట్‌ను పోస్ట్‌ప్రాసెసింగ్ చేయడం[[postprocessing-the-output]] + +మోడల్ నుండి వచ్చే అవుట్‌పుట్ విలువలు స్వతహాగా అర్థమయ్యే విధంగా ఉండకపోవచ్చు. ఒకసారి చూద్దాం: + +```python +print(outputs.logits) +``` + +```python out +tensor([[-1.5607, 1.6123], + [ 4.1692, -3.3464]], grad_fn=) +``` + +మన మోడల్ మొదటి వాక్యానికి `[-1.5607, 1.6123]` ను, రెండవ వాక్యానికి `[ 4.1692, -3.3464]` ను అంచనా వేసింది. ఇవి probabilities కావు — ఇవి *logits*, అంటే మోడల్ చివరి లేయర్ ఉత్పత్తి చేసే raw, unnormalized స్కోర్లు. ఇవి probabilities‌ గా మారాలంటే [SoftMax](https://en.wikipedia.org/wiki/Softmax_function) లేయర్ ద్వారా పంపాలి. +(అన్ని 🤗 Transformers మోడళ్లు logits ను 출력 చేస్తాయి, ఎందుకంటే ట్రైనింగ్‌లో loss function సాధారణంగా SoftMax వంటి చివరి activation ను cross-entropy వంటి loss తో కలిపి ఉపయోగిస్తుంది.) + +```py +import torch + +predictions = torch.nn.functional.softmax(outputs.logits, dim=-1) +print(predictions) +``` + +```python out +tensor([[4.0195e-02, 9.5980e-01], + [9.9946e-01, 5.4418e-04]], grad_fn=) +``` + +ఇప్పుడు మనకు స్పష్టంగా కనిపిస్తోంది: మొదటి వాక్యానికి మోడల్ `[0.0402, 0.9598]`, రెండవ వాక్యానికి `[0.9995, 0.0005]` probabilities ను ఇచ్చింది. ఇవి అర్థమయ్యే probability స్కోర్లు. + +ప్రతి స్థానానికి సంబంధించిన లేబుళ్లను తెలుసుకోవడానికి, మోడల్ యొక్క config లోని `id2label` లక్షణాన్ని చూడవచ్చు (దీని గురించి తరువాతి విభాగంలో మరింత తెలుసుకుంటాము): + +```python +model.config.id2label +``` + +```python out +{0: 'NEGATIVE', 1: 'POSITIVE'} +``` + +ఇప్పుడు మనం ఈ విధంగా నిర్ణయించవచ్చు: + +- మొదటి వాక్యం: NEGATIVE: 0.0402, POSITIVE: 0.9598 +- రెండవ వాక్యం: NEGATIVE: 0.9995, POSITIVE: 0.0005 + +ఇలా మనం పైప్‌లైన్‌లోని మూడు దశలను విజయవంతంగా పునరుద్ధరించాము: టోకనైజర్‌తో ప్రీప్రాసెసింగ్, మోడల్ ద్వారా పంపించడం, మరియు పోస్ట్‌ప్రాసెసింగ్! +ఇప్పుడు ఈ ప్రతి దశను మరింత లోతుగా పరిశీలిద్దాం. + + + +✏️ **ప్రయత్నించండి!** మీ స్వంత రెండు (లేదా మరిన్ని) వాక్యాలను ఎంచుకుని వాటిని `sentiment-analysis` పైప్‌లైన్‌లో నడపండి. తరువాత ఇక్కడ చూపిన దశలను ఒక్కొక్కటిగా పునరావృతం చేసి, అదే ఫలితాలు వస్తున్నాయా చూడండి! + + diff --git a/chapters/te/chapter2/3.mdx b/chapters/te/chapter2/3.mdx new file mode 100644 index 000000000..5d995d205 --- /dev/null +++ b/chapters/te/chapter2/3.mdx @@ -0,0 +1,324 @@ + + +# మోడళ్లు[[the-models]] + + + + + +ఈ విభాగంలో, మోడల్‌లను సృష్టించడం మరియు ఉపయోగించడం గురించి మరింత లోతుగా పరిశీలిద్దాం. మనం `AutoModel` క్లాస్‌ను ఉపయోగిస్తాము, ఇది ఏ checkpoint నుండి అయినా మోడల్‌ను instantiate చేయాలనుకున్నప్పుడు చాలా ఉపయోగపడుతుంది. + +## ఒక Transformer ను సృష్టించడం[[creating-a-transformer]] + +`AutoModel` ను instantiate చేసినప్పుడు ఏమి జరుగుతుందో చూద్దాం: + +```py +from transformers import AutoModel + +model = AutoModel.from_pretrained("bert-base-cased") +``` + +టోకనైజర్ మాదిరిగానే, `from_pretrained()` పద్ధతి Hugging Face Hub నుండి మోడల్ డేటాను డౌన్‌లోడ్ చేసి cache చేస్తుంది. ముందే చెప్పినట్లుగా, checkpoint పేరు ఒక నిర్దిష్ట మోడల్ architecture మరియు దాని weights ను సూచిస్తుంది. ఈ ఉదాహరణలో, ఇది ఒక BERT ఆధారిత మోడల్ — 12 layers, 768 hidden size, 12 attention heads — మరియు *cased* ఇన్‌పుట్‌లతో (అంటే uppercase/lowercase తేడా ముఖ్యం). +Hub లో అనేక checkpoints అందుబాటులో ఉన్నాయి — మీరు వాటిని [ఇక్కడ](https://huggingface.co/models) పరిశీలించవచ్చు. + +`AutoModel` క్లాస్ మరియు దాని సంబంధిత "Auto" క్లాస్‌లు, ఇవ్వబడిన checkpoint కి సరిపోయే మోడల్ architecture ను ఆటోమేటిక్‌గా ఎంచుకుని సరైన మోడల్ క్లాస్‌ను instantiate చేసే సరళమైన wrappers మాత్రమే. +మీరు ఉపయోగించాలనుకునే మోడల్ రకం ముందే తెలుసుకుంటే, architecture ని నిర్వచించే క్లాస్‌ను నేరుగా ఉపయోగించవచ్చు: + +```py +from transformers import BertModel + +model = BertModel.from_pretrained("bert-base-cased") +``` + +## లోడ్ చేయడం మరియు సేవ్ చేయడం[[loading-and-saving]] + +మోడల్‌ను సేవ్ చేయడం, tokenizer ను సేవ్ చేసినంత సులభం. నిజానికి, మోడళ్లలో కూడా అదే `save_pretrained()` పద్ధతి ఉంటుంది, ఇది మోడల్ యొక్క weights మరియు architecture configuration ను సేవ్ చేస్తుంది: + +```py +model.save_pretrained("directory_on_my_computer") +``` + +దీంతో మీ కంప్యూటర్‌లోని ఫోల్డర్‌లో ఈ రెండు ఫైళ్లు సేవ్ అవుతాయి: + +``` +ls directory_on_my_computer + +config.json model.safetensors +``` + +config.json ఫైల్‌ను ఓపెన్ చేసి చూస్తే, మోడల్ architecture ను నిర్మించడానికి అవసరమైన attributes అన్నీ కనిపిస్తాయి. ఇందులో checkpoint ఎక్కడి నుండి వచ్చింది, అలాగే మీరు చివరిగా ఈ checkpoint ను సేవ్ చేసినప్పుడు ఉపయోగించిన 🤗 Transformers వెర్షన్ వంటి metadata కూడా ఉంటుంది. + +pytorch_model.safetensors ఫైల్‌ను state dictionary అంటారు; ఇందులో మోడల్ యొక్క అన్ని weights ఉంటాయి. +ఈ రెండు ఫైళ్లు కలిసే పని చేస్తాయి: configuration ఫైల్ architecture వివరాలను ఇస్తుంది; weights ఫైల్ మోడల్ యొక్క parameters ను కలిగి ఉంటుంది. + +సేవ్ చేసిన మోడల్‌ను మళ్లీ ఉపయోగించాలంటే, `from_pretrained()` పద్ధతిని మరోసారి ఉపయోగిస్తాము: + +```py +from transformers import AutoModel + +model = AutoModel.from_pretrained("directory_on_my_computer") +``` + +🤗 Transformers లైబ్రరీలోని అద్భుతమైన లక్షణాల్లో ఒకటి — మోడళ్లను మరియు టోకనైజర్‌లను సమాజంతో సులభంగా పంచుకునే సామర్థ్యం. దీని కోసం, ముందుగా మీరు [Hugging Face](https://huggingface.co) లో ఒక ఖాతా కలిగి ఉండాలి. +మీరు ఒక notebook వాడుతున్నట్లయితే, ఈ విధంగా సులభంగా లాగిన్ కావచ్చు: + +```python +from huggingface_hub import notebook_login + +notebook_login() +``` + +లేదా, మీరు టెర్మినల్ ఉపయోగిస్తుంటే, ఇలా నడపండి: + +```bash +huggingface-cli login +``` + +తర్వాత, `push_to_hub()` పద్ధతిని ఉపయోగించి మోడల్‌ను Hub కు పంపవచ్చు: + +```py +model.push_to_hub("my-awesome-model") +``` + +ఇది మీ మోడల్ ఫైళ్లను Hub లోకి, మీ namespace కింద ఉన్న *my-awesome-model* అనే repository లోకి అప్లోడ్ చేస్తుంది. +అప్పుడు ఎవరైనా మీ మోడల్‌ను `from_pretrained()` తో లోడ్ చేసుకోవచ్చు! + +```py +from transformers import AutoModel + +model = AutoModel.from_pretrained("your-username/my-awesome-model") +``` + +Hub API తో మీరు ఇంకా చాలా పనులు చేయవచ్చు: +- స్థానిక repository నుండి నేరుగా మోడల్‌ను push చేయడం +- మొత్తం మోడల్‌ను తిరిగి అప్లోడ్ చేయకుండా, ప్రత్యేకమైన ఫైళ్లను మాత్రమే అప్డేట్ చేయడం +- మోడల్‌కు సంబంధించిన సామర్థ్యాలు, పరిమితులు, bias లు మొదలైన వాటిని వివరించే model cards జోడించడం + +ఇవన్నీ ఎలా చేయాలో తెలుసుకోవడానికి [డాక్యుమెంటేషన్](https://huggingface.co/docs/huggingface_hub/how-to-upstream) ను చూడండి, లేదా మరింత లోతైన వివరణ కోసం advanced [Chapter 4](/course/chapter4) ను పరిశీలించండి. + +## టెక్స్ట్‌ను ఎన్కోడ్ చేయడం[[encoding-text]] + +Transformer మోడళ్లు టెక్స్ట్‌ను ప్రాసెస్ చేయేటప్పుడు, ఇన్‌పుట్‌ను సంఖ్యలుగా మార్చి పనిచేస్తాయి. ఈ విభాగంలో, tokenizer మీ టెక్స్ట్‌ను ప్రాసెస్ చేసినప్పుడు నిజంగా ఏమి జరుగుతుందో చూద్దాం. [అధ్యాయం 1](/course/chapter1)లో చూసినట్లుగా, tokenizers టెక్స్ట్‌ను tokens గా విడదీసి, ఆ tokens ను సంఖ్యలుగా మార్చుతాయి. ఈ మార్పును ఒక సరళమైన tokenizer ద్వారా పరిశీలించవచ్చు: + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + +encoded_input = tokenizer("Hello, I'm a single sentence!") +print(encoded_input) +``` + +```python out +{'input_ids': [101, 8667, 117, 1000, 1045, 1005, 1049, 2235, 17662, 12172, 1012, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +మనకు వచ్చిన dictionary లో ఈ క్రింది fields ఉంటాయి: +- `input_ids`: మీ tokens యొక్క సంఖ్యాత్మక ప్రతినిధులు +- `token_type_ids`: ఇన్‌పుట్‌లో sentence A ఏది, sentence B ఏదో మోడల్‌కి తెలియజేస్తాయి (దీన్ని తరువాతి విభాగంలో మరింతగా చూడవచ్చు) +- `attention_mask`: మోడల్ ఏ tokens పై దృష్టి పెట్టాలి, ఏవిపై పెట్టకూడదో సూచిస్తుంది (కాసేపటి తర్వాత దీనిని వివరించబడుతుంది) + +ఈ input IDs ను మళ్లీ decode చేస్తే అసలు టెక్స్ట్‌ను తిరిగి పొందవచ్చు: + +```py +tokenizer.decode(encoded_input["input_ids"]) +``` + +```python out +"[CLS] Hello, I'm a single sentence! [SEP]" +``` + +మీరు గమనించగలరు: tokenizer `[CLS]`, `[SEP]` వంటి ప్రత్యేక tokens ను జోడించింది — ఇవి ఆ మోడల్‌కు అవసరమైనవి. అన్ని మోడళ్లకు special tokens అవసరం ఉండవు; ఒక మోడల్ training దశలో వీటిని ఉపయోగించి ఉంటే, tokenizer కూడా వాటిని జోడించాల్సి ఉంటుంది. + +ఒకేసారి అనేక వాక్యాలను encode చేయవచ్చు — batching ద్వారా (దాని గురించి త్వరలో తెలుసుకుంటాము), లేదా సాదాసీదాగా వాక్యాల జాబితాను పంపడం ద్వారా: + +```py +encoded_input = tokenizer("How are you?", "I'm fine, thank you!") +print(encoded_input) +``` + +```python out +{'input_ids': [[101, 1731, 1132, 1128, 136, 102], [101, 1045, 1005, 1049, 2503, 117, 5763, 1128, 136, 102]], + 'token_type_ids': [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], + 'attention_mask': [[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]} +``` + +గమనించండి: అనేక వాక్యాలను పంపినప్పుడు, tokenizer ప్రతి dictionary key కి, ప్రతి వాక్యానికి వేర్వేరు లిస్ట్‌లను ఇస్తుంది. +మనం tokenizer ను నేరుగా PyTorch tensors ను తిరిగి ఇవ్వమని కూడా అడగవచ్చు: + +```py +encoded_input = tokenizer("How are you?", "I'm fine, thank you!", return_tensors="pt") +print(encoded_input) +``` + +```python out +{'input_ids': tensor([[ 101, 1731, 1132, 1128, 136, 102], + [ 101, 1045, 1005, 1049, 2503, 117, 5763, 1128, 136, 102]]), + 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), + 'attention_mask': tensor([[1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])} +``` + +కానీ ఇక్కడ ఒక సమస్య ఉంది: ఈ రెండు లిస్ట్‌లు ఒకే పొడవు (length) కలిగి లేవు! Arrays మరియు tensors rectangular (సమచతురస్రాకార) గా ఉండాలి, కాబట్టి ఈ lists ను నేరుగా PyTorch tensor (లేదా NumPy array) గా మార్చలేం. +దీనిని పరిష్కరించడానికి tokenizer లో *padding* అనే ఎంపిక ఉంది. + +### ఇన్‌పుట్‌లను ప్యాడింగ్ చేయడం[[padding-inputs]] + +మనం tokenizer కు padding చేయమని చెబితే, అది అన్ని వాక్యాలను ఒకే పొడవు కలిగేలా చేస్తుంది — అంటే, అతి పొడవైన వాక్యానికి సరిపడేలా చిన్న వాక్యాల చివరకు ప్రత్యేకమైన padding token ను జోడిస్తుంది: + +```py +encoded_input = tokenizer( + ["How are you?", "I'm fine, thank you!"], padding=True, return_tensors="pt" +) +print(encoded_input) +``` + +```python out +{'input_ids': tensor([[ 101, 1731, 1132, 1128, 136, 102, 0, 0, 0, 0], + [ 101, 1045, 1005, 1049, 2503, 117, 5763, 1128, 136, 102]]), + 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), + 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 0, 0, 0, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])} +``` + +ఇప్పుడు మనకు rectangular tensors వచ్చాయి! +గమనించండి: padding tokens కు input IDs లో 0 అనే ID వచ్చింది, మరియు వాటి attention mask విలువ కూడా 0. +దానికి కారణం — ఈ padding tokens ను మోడల్ విశ్లేషించకూడదు; ఇవి నిజమైన వాక్యంలో భాగం కావు. + + +### ఇన్‌పుట్‌లను ట్రంకేట్ చేయడం[[truncating-inputs]] + +కొన్ని సందర్భాల్లో tensors చాలా పెద్దవుగా మారి, మోడల్ వాటిని ప్రాసెస్ చేయలేకపోవచ్చు. ఉదాహరణకు, BERT ప్రీట్రైనింగ్ చేయబడింది గరిష్టంగా **512 tokens** వరకు మాత్రమే. +అంటే, ఆకు మించిన పొడవు ఉన్న వాక్యాలను ప్రాసెస్ చేయలేడని అర్థం. + +అలా మోడల్ హ్యాండిల్ చేయలేని పొడవైన వాక్యాలు ఉంటే, వాటిని `truncation` పరామీటర్‌ ద్వారా చిన్నదిగా చేయాలి: + + +```py +encoded_input = tokenizer( + "This is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long sentence.", + truncation=True, +) +print(encoded_input["input_ids"]) +``` + +```python out +[101, 1188, 1110, 170, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1179, 5650, 119, 102] +``` + +Padding మరియు truncation ను కలిపి ఉపయోగిస్తే, మీ tensors మీకు కావాల్సిన ఖచ్చితమైన పరిమాణంలో ఉంటాయి: + +```py +encoded_input = tokenizer( + ["How are you?", "I'm fine, thank you!"], + padding=True, + truncation=True, + max_length=5, + return_tensors="pt", +) +print(encoded_input) +``` + +```python out +{'input_ids': tensor([[ 101, 1731, 1132, 1128, 102], + [ 101, 1045, 1005, 1049, 102]]), + 'token_type_ids': tensor([[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]]), + 'attention_mask': tensor([[1, 1, 1, 1, 1], + [1, 1, 1, 1, 1]])} +``` + +### ప్రత్యేక tokens ని జోడించడం + +Special tokens (లేదా వాటి భావం) BERT మరియు దాని ఆధారిత మోడళ్లకు చాలా ముఖ్యమైనవి. +ఈ tokens వాక్యాల పరిమితులను సూచించడానికి ఉపయోగపడతాయి — ఉదాహరణకు: + +- వాక్య ప్రారంభం: `[CLS]` +- రెండు వాక్యాల మధ్య విభజన: `[SEP]` + +ఇదిగో ఒక సాధారణ ఉదాహరణ: + +```py +encoded_input = tokenizer("How are you?") +print(encoded_input["input_ids"]) +tokenizer.decode(encoded_input["input_ids"]) +``` + +```python out +[101, 1731, 1132, 1128, 136, 102] +'[CLS] How are you? [SEP]' +``` + +ఈ special tokens ను tokenizer స్వయంచాలకంగా జోడిస్తుంది. +అన్ని మోడళ్లకు ఇవి అవసరం కాదు; +మోడల్ ప్రీట్రైనింగ్ దశలో special tokens వాడినప్పుడు మాత్రమే tokenizer వాటిని జోడిస్తుంది — ఎందుకంటే మోడల్ వాటిని ఆశిస్తుంది. + +### ఇది అంతా ఎందుకు అవసరం? + +ఇదిగో ఒక స్పష్టమైన ఉదాహరణ. ఈ encoded sequences ను పరిశీలించండి: + +```py +sequences = [ + "I've been waiting for a HuggingFace course my whole life.", + "I hate this so much!", +] +``` + +Tokenize చేసిన తర్వాత మనకు ఇది వస్తుంది: + +```python +encoded_sequences = [ + [ + 101, + 1045, + 1005, + 2310, + 2042, + 3403, + 2005, + 1037, + 17662, + 12172, + 2607, + 2026, + 2878, + 2166, + 1012, + 102, + ], + [101, 1045, 5223, 2023, 2061, 2172, 999, 102], +] +``` + +ఇది ఒక లిస్ట్ ఆఫ్ లిస్ట్‌లు — అంటే, సంఖ్యలతో కూడిన అనేక లిస్ట్‌లు. +టెన్సర్లు మాత్రం **సమచతురస్రాకార (rectangular)** ఆకారాన్ని మాత్రమే అంగీకరిస్తాయి — మ్యాట్రిసులకు ఆలోచించండి. + +ఈ ఉదాహరణలో "array" ఇప్పటికే rectangularగా ఉంది, కాబట్టి దీనిని tensor గా మార్చడం చాలా సులభం: + +```py +import torch + +model_inputs = torch.tensor(encoded_sequences) +``` + +### టెన్సర్లను మోడల్‌కు ఇన్‌పుట్‌లుగా ఉపయోగించడం[[using-the-tensors-as-inputs-to-the-model]] + +టెన్సర్లను మోడల్‌తో ఉపయోగించడం చాలా సులభం — మనం inputs తో మోడల్‌ను నేరుగా పిలుస్తాం: + +```py +output = model(model_inputs) +``` + +మోడల్ అనేక రకాల arguments అంగీకరిస్తుంది, కానీ **input IDs తప్పనిసరి**. +ఇతర arguments ఏమి చేస్తాయి, ఎప్పుడు అవసరం పడతాయో తరువాతి విభాగాల్లో వివరంగా చూస్తాం. + +కానీ ముందుగా, టోకెనైజర్లు Transformer మోడళ్లకు అర్థమయ్యే ఇన్‌పుట్‌లను ఎలా తయారు చేస్తాయో మరింత లోతుగా తెలుసుకోవాలి. diff --git a/chapters/te/chapter2/4.mdx b/chapters/te/chapter2/4.mdx new file mode 100644 index 000000000..47ae5df4f --- /dev/null +++ b/chapters/te/chapter2/4.mdx @@ -0,0 +1,234 @@ + + +# టోకనైజర్లు[[tokenizers]] + + + + + +టోకనైజర్లు NLP పైప్‌లైన్‌లోని ముఖ్య భాగాల్లో ఒకటి. వీటి లక్ష్యం ఒక్కటే: టెక్స్ట్‌ను మోడల్ ప్రాసెస్ చేయగలిగే డేటాగా మార్చడం. మోడళ్లు సంఖ్యలతోనే పని చేయగలవు, కాబట్టి టోకనైజర్లు మన టెక్స్ట్ ఇన్‌పుట్‌లను సంఖ్యాత్మక డేటాగా మారుస్తాయి. +ఈ విభాగంలో, టోకనైజేషన్ పైప్‌లైన్‌లో నిజానికి ఏమి జరుగుతుందో పరిశీలిద్దాం. + + +NLP పనుల్లో సాధారణంగా ప్రాసెస్ చేయబడే డేటా raw text. ఉదాహరణకు: + +``` +Jim Henson was a puppeteer +``` + +అయితే, మోడళ్లు సంఖ్యలను మాత్రమే ప్రాసెస్ చేయగలవు కాబట్టి, raw text‌ను సంఖ్యలుగా మార్చే మార్గాన్ని కనుగొనాలి. అదే టోకనైజర్ చేసే పని, మరియు దీన్ని చేయడానికి అనేక పద్ధతులు ఉన్నాయి. లక్ష్యం ఏమిటంటే, మోడల్‌కి ఎక్కువ అర్థమయ్యే — సాధ్యమైతే, అత్యంత చిన్న — ప్రతినిధిని (representation) కనుగొనడం. + +ఇప్పుడు కొన్ని టోకనైజేషన్ అల్గోరిథమ్‌ల ఉదాహరణలను చూసి, టోకనైజేషన్ గురించి మీకు ఉండొచ్చిన కొన్ని ప్రశ్నలకు సమాధానాలు కనుగొనడానికి ప్రయత్నిద్దాం. + +## పదాల ఆధారంగా[[word-based]] + + + +మెదట గుర్తొచ్చే టోకనైజర్ రకం *word-based* టోకనైజర్. కొద్దిపాటి నియమాలతో సులభంగా సెటప్ చేయవచ్చు, ఉపయోగించడం కూడా తేలిక, మరియు చాలా సందర్భాల్లో బాగానే ఫలితాలు ఇస్తుంది. +ఉదాహరణకు, క్రింది బొమ్మలో లక్ష్యం ఏమిటంటే, raw text ను పదాలుగా విభజించి, ప్రతి పదానికి సంఖ్యాత్మక ప్రతినిధిని కనుగొనడం: + +
+ పదాల ఆధారంగా టోకనైజేషన్ చేసిన ఒక ఉదాహరణ. + +
+ +టెక్స్ట్‌ను విభజించడానికి విభిన్న పద్ధతులు ఉన్నాయి. ఉదాహరణకు, Python లో `split()` ఫంక్షన్‌ను ఉపయోగించి, whitespace ఆధారంగా పదాలుగా విభజించవచ్చు: + +```py +tokenized_text = "Jim Henson was a puppeteer".split() +print(tokenized_text) +``` + +```python out +['Jim', 'Henson', 'was', 'a', 'puppeteer'] +``` + +కొన్ని word tokenizers పంక్చుయేషన్ కోసం అదనపు నియమాలను కూడా కలిగి ఉంటాయి. ఇటువంటి టోకనైజర్‌తో మనకు చాలా పెద్ద "vocabulary" రావచ్చు — ఇక్కడ vocabulary అంటే మన corpus లో ఉన్న అన్ని స్వతంత్ర tokens సంఖ్య. + +ప్రతీ పదానికి ఒక ID కేటాయిస్తారు; అది 0 నుండి vocabulary పరిమాణం వరకు ఉంటుంది. మోడల్ ప్రతి పదాన్ని గుర్తించడానికి ఈ IDs ను ఉపయోగిస్తుంది. + +ఒక భాషలోని అన్ని పదాలను word-based టోకనైజర్ ద్వారా కవర్ చేయాలంటే, ప్రతి పదానికి ఒక్కో identifier ఉండాలి; ఇది చాలా పెద్ద సంఖ్యలో tokens‌ను ఉత్పత్తి చేస్తుంది. ఉదాహరణకు, ఆంగ్లంలో 500,000 కంటే ఎక్కువ పదాలు ఉన్నాయి, కాబట్టి ప్రతి పదాన్ని ఒక input ID కి మ్యాప్ చేయడానికి అంతటి IDs ను నిర్వహించాలి. +ఇదంతా కాకుండా, "dog" మరియు "dogs" లాంటి పదాలను మోడల్ మొదట్లో పూర్తిగా వేర్వేరుగా చూస్తుంది — "dog" మరియు "dogs" పరస్పర సంబంధం లేకుండా కనిపిస్తాయి. ఇదే విషయం "run" మరియు "running" వంటి ఇతర పదాలకు కూడా వర్తిస్తుంది. + +చివరగా, vocabulary లో లేని పదాలను సూచించడానికి ఒక ప్రత్యేక token అవసరం. దీన్ని సాధారణంగా "unknown" token అంటారు, " [UNK] " లేదా "<unk>" వంటివి. టోకనైజర్ చాలా ఎక్కువ unknown tokens ఉత్పత్తి చేస్తూ ఉంటే, అది మంచిది కాదు — ఎందుకంటే అది ఆ పదానికి సరైన ప్రతినిధిని కనుగొనలేకపోయింది, మధ్యలో సమాచారం కోల్పోతున్నామన్నమాట. కాబట్టి vocabulary రూపొందించేప్పుడు లక్ష్యం ఏమిటంటే, tokenizer వీలైనంత తక్కువ పదాలను unknown token గా మార్చేలా ఉండాలి. + +ఇలాంటి unknown tokens సంఖ్యను తగ్గించడానికి, మనం ఒక స్థాయి లోతుగా వెళ్లి _character-based_ టోకనైజర్‌ను ఉపయోగించవచ్చు. + +## అక్షరాల ఆధారంగా[[character-based]] + + + +Character-based టోకనైజర్లు టెక్స్ట్‌ను పదాల కంటే, అక్షరాలుగా విభజిస్తాయి. దీనికి రెండు ప్రధాన ప్రయోజనాలు ఉన్నాయి: + +- vocabulary చాలా చిన్నదిగా ఉంటుంది. +- out-of-vocabulary (unknown) tokens చాలా తక్కువగా ఉంటాయి, ఎందుకంటే ప్రతి పదాన్ని అక్షరాల నుంచి నిర్మించవచ్చు. + +కానీ ఇక్కడ కూడా spaces మరియు పంక్చుయేషన్ గురించి కొన్ని ప్రశ్నలు వస్తాయి: + +
+ అక్షరాల ఆధారంగా టోకనైజేషన్ చేసిన ఒక ఉదాహరణ. + +
+ +ఈ విధానం కూడా పరిపూర్ణం కాదు. ప్రతినిధి ఇప్పుడు పదాల ఆధారంగా కాకుండా అక్షరాల ఆధారంగా ఉందని గమనించండి; సహజంగానే చూసుకుంటే, ఒక్కో అక్షరం అంత అర్థవంతం కాకపోవచ్చు, కానీ ఒక్కో పదం మాత్రం సాధారణంగా అర్థవంతంగానే ఉంటుంది. +అయితే ఇది కూడా భాషపై ఆధారపడి ఉంటుంది — ఉదాహరణకు, చైనీస్‌లో ఒక్కో అక్షరమే చాలా సమాచారం కలిగిఉంటుంది, కానీ లాటిన్ లిపి భాషల్లో అది తక్కువ. + +మరికొక విషయం ఏమిటంటే, ఈ విధానంతో మన మోడల్ ప్రాసెస్ చేయాల్సిన tokens సంఖ్య చాలా పెరుగుతుంది: word-based టోకనైజర్‌లో ఒక పదానికి ఒకే token ఉంటే, character-based టోకనైజర్‌లో అదే పదం సులభంగా 10 లేదా అంతకంటే ఎక్కువ tokens గా మారిపోతుంది. + +ఇద్దరిలోనూ ఉన్న మంచితనాన్ని పొందడానికి, మూడో పద్ధతిని ఉపయోగించవచ్చు: *subword tokenization*. + +## సబ్‌వర్డ్ టోకనైజేషన్[[subword-tokenization]] + + + +Subword టోకనైజేషన్ అల్గోరిథమ్‌ల ప్రాథమిక సూత్రం ఏమిటంటే: +తరచుగా వాడే పదాలను చిన్న subwords గా విభజించకూడదు, కానీ అరుదుగా వచ్చే పదాలను అర్థవంతమైన subwords గా విభజించాలి. + +ఉదాహరణకు, "annoyingly" అనే పదం అరుదుగా వస్తుంది, కాబట్టి దాన్ని "annoying" మరియు "ly" గా విభజించవచ్చు. ఇవి రెండూ సొంతంగా subwords గా ఎక్కువగా కనిపించే అవకాశం ఉంది, అలాగే "annoying" + "ly" కలయిక "annoyingly" అనే భావాన్ని కూడా నిలుపుతుంది. + +"Let's do tokenization!" అనే వాక్యానికి ఒక subword టోకనైజేషన్ అల్గోరిథమ్ ఈ విధంగా టోకనైజ్ చేస్తుందనుకోండి: + +
+ సబ్‌వర్డ్ టోకనైజేషన్ అల్గోరిథమ్ యొక్క ఒక ఉదాహరణ. + +
+ +ఇలాంటి subwords మంచి semantic అర్థాన్ని ఇస్తాయి. ఉదాహరణలో "tokenization" ను "token" మరియు "ization" గా విభజించారు — ఇవి రెండూ semantic meaning కలిగిన tokens, అలాగే space-efficient కూడా (పొడవైన పదాన్ని సూచించడానికి కేవలం రెండు tokens సరిపోతాయి). +దీంతో చిన్న vocabularies తోనే మంచి coverage పొందగలం, unknown tokens కూడా దాదాపు ఉండవు. + +ఈ విధానం Turkish లాంటి agglutinative భాషల్లో మరింత ఉపయోగకరంగా ఉంటుంది, ఎందుకంటే అక్కడ subwords ను కలిపి చాలా పొడవైన సమిష్టి పదాలు సులభంగా తయారు చేయవచ్చు. + +### ఇంకా చాలా![[and-more]] + +అందుబాటులో ఇంకా చాలా tokenization పద్ధతులు ఉండటం ఆశ్చర్యకరం కాదు. కొన్ని ముఖ్యమైనవి: + +- Byte-level BPE — GPT-2 లో ఉపయోగించిన పద్ధతి +- WordPiece — BERT లో ఉపయోగించబడింది +- SentencePiece లేదా Unigram — కొన్ని multilingual మోడళ్లలో ఉపయోగిస్తారు + +ఇప్పటికి, టోకనైజర్‌లు ఎలా పనిచేస్తాయో అర్థం చేసుకుని, API తో పని చేయడానికి మీ వద్ద సరిపడిన పునాదులు ఉన్నాయి. + +## లోడ్ చేయడం మరియు సేవ్ చేయడం[[loading-and-saving]] + +టోకనైజర్లను లోడ్ చేయడం, సేవ్ చేయడం కూడా మోడళ్ల మాదిరిగానే సులభం. నిజానికి, ఇవి కూడా అదే రెండు పద్ధతులపై ఆధారపడి ఉంటాయి: `from_pretrained()` మరియు `save_pretrained()`. +ఈ పద్ధతులు టోకనైజర్ ఉపయోగించే అల్గోరిథమ్ (మోడల్ యొక్క *architecture* లాంటిది) తో పాటు దాని vocabulary (మోడల్ *weights* లాంటిది) ను కూడా లోడ్ చేయడం లేదా సేవ్ చేయడం చేస్తాయి. + +BERT తో ప్రీట్రైన్ చేయబడిన అదే checkpoint కు సంబంధించిన BERT tokenizer ను లోడ్ చేయడం, మోడల్ లోడ్ చేయడంలా ఉంటుంది, కానీ ఇక్కడ మనం `BertTokenizer` క్లాస్‌ను ఉపయోగిస్తాము: + +```py +from transformers import BertTokenizer + +tokenizer = BertTokenizer.from_pretrained("bert-base-cased") +``` + +`AutoModel` మాదిరిగానే, `AutoTokenizer` క్లాస్ కూడా checkpoint పేరును ఆధారంగా తీసుకుని, లైబ్రరీలోని సరైన tokenizer క్లాస్‌ను ఎంచుకుంటుంది, మరియు ఏ checkpoint తోనైనా నేరుగా ఉపయోగించవచ్చు: + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +``` + +ఇప్పుడు గత విభాగంలో చూసినట్లే tokenizer ను ఉపయోగించవచ్చు: + +```python +tokenizer("Using a Transformer network is simple") +``` + +```python out +{'input_ids': [101, 7993, 170, 11303, 1200, 2443, 1110, 3014, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +టోకనైజర్‌ను సేవ్ చేయడం కూడా మోడల్ సేవ్ చేసినట్లే ఉంటుంది: + +```py +tokenizer.save_pretrained("directory_on_my_computer") +``` + +`token_type_ids` గురించి [Chapter 3](/course/chapter3) లో మరింతగా మాట్లాడతాం, అలాగే `attention_mask` కీ గురించి కాస్త తర్వాత వివరిస్తాము. +ముందుగా, `input_ids` ఎలా రూపొందించబడతాయో చూద్దాం. అందుకు tokenizer లోని intermediate methods ను పరిశీలించాలి. + +## Encoding[[encoding]] + + + +టెక్స్ట్‌ను సంఖ్యలుగా మార్చే ప్రక్రియను *encoding* అంటారు. ఇది రెండు దశల్లో జరుగుతుంది: ముందుగా tokenization, తరువాత వాటిని input IDs గా మార్చడం. + +ముందు చూశినట్లుగా, మొదటి దశలో టెక్స్ట్‌ను పదాలుగా (లేదా పద భాగాలుగా, punctuation చిహ్నాలుగా మొదలైనవి) విభజిస్తారు; వీటినే సాధారణంగా *tokens* అంటారు. ఈ ప్రక్రియ ఎలా జరగాలి అన్నదానికి అనేక నియమాలు ఉండవచ్చు, అందుకే మనం tokenizer ను instantiate చేయేటప్పుడు మోడల్ పేరును ఇస్తాం — మోడల్ ప్రీట్రైనింగ్ సమయంలో ఉపయోగించిన అదే నియమాలను ఇక్కడ కూడా ఉపయోగించడానికి. + +రెండవ దశలో, ఆ tokens ను సంఖ్యలుగా మార్చుతాం, తద్వారా వాటితో టెన్సర్‌ను నిర్మించి మోడల్‌కు పంపగలం. దీని కోసం tokenizer వద్ద ఒక *vocabulary* ఉంటుంది — `from_pretrained()` పద్ధతితో instantiate చేసినప్పుడు డౌన్‌లోడ్ అయ్యే భాగం ఇదే. +ఇక్కడ కూడా, మోడల్ ప్రీట్రైనింగ్ సమయంలో ఉపయోగించిన అదే vocabulary ను ఉపయోగించాలి. + +ఈ రెండు దశలను మెరుగ్గా అర్థం చేసుకోవడానికి, వాటిని వేర్వేరుగా పరిశీలిద్దాం. గమనించాల్సిన విషయం ఏమిటంటే, ఇక్కడ మనం tokenization పైప్‌లైన్‌లోని భాగాలను విడివిడిగా చూపే కొన్ని methods ను ఉపయోగిస్తాము, intermediate ఫలితాలను చూడటానికి. కానీ ఆచరణలో, మీరు ముందున్న సెక్షన్ 2 లో చూపినట్లుగా, మీ ఇన్‌పుట్‌లపై tokenizer ను నేరుగా కాల్ చేయాల్సిందే. + +### Tokenization[[tokenization]] + +టోకనైజేషన్ ప్రక్రియ tokenizer యొక్క `tokenize()` పద్ధతి ద్వారా జరుగుతుంది: + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + +sequence = "Using a Transformer network is simple" +tokens = tokenizer.tokenize(sequence) + +print(tokens) +``` + +ఈ పద్ధతి ఫలితంగా stringల జాబితా వస్తుంది — ఇవే tokens: + +```python out +['Using', 'a', 'transform', '##er', 'network', 'is', 'simple'] +``` + +ఈ tokenizer ఒక subword tokenizer: ఇది తన vocabularyలో ఉన్న subwords వచ్చే వరకు పదాలను చిన్న భాగాలుగా విభజిస్తుంది. ఇక్కడ `transformer` అనే పదం `transform` మరియు `##er` అనే రెండు tokens గా విభజించబడింది. + +### Tokens నుండి input IDs వరకు[[from-tokens-to-input-ids]] + +Tokens ను input IDs గా మార్చడం tokenizer లోని `convert_tokens_to_ids()` పద్ధతి ద్వారా జరుగుతుంది: + +```py +ids = tokenizer.convert_tokens_to_ids(tokens) + +print(ids) +``` + +```python out +[7993, 170, 11303, 1200, 2443, 1110, 3014] +``` + +ఈ outputs ను సరైన framework tensor గా మార్చిన తర్వాత, ఇవి ఈ అధ్యాయంలో ముందుగా చూసినట్లుగానే మోడల్‌కు ఇన్‌పుట్‌లుగా ఉపయోగించవచ్చు. + + + +✏️ **ప్రయత్నించండి!** సెక్షన్ 2 లో ఉపయోగించిన రెండు వాక్యాలపై (`"I've been waiting for a HuggingFace course my whole life."` మరియు `"I hate this so much!"`) ఈ చివరి రెండు దశలను (tokenization మరియు input IDs గా మార్పు) మళ్లీ చేయండి. మీరు ముందుగా చూసినట్లే అదే input IDs వస్తున్నాయో లేదో తనిఖీ చేయండి! + + + +## Decoding[[decoding]] + +*Decoding* అంటే పక్కదారి — vocabulary indices నుంచి మళ్లీ string కు రావడం. ఇది `decode()` పద్ధతి ద్వారా చేయవచ్చు: + +```py +decoded_string = tokenizer.decode([7993, 170, 11303, 1200, 2443, 1110, 3014]) +print(decoded_string) +``` + +```python out +'Using a Transformer network is simple' +``` + +`decode` పద్ధతి indices ను tokens గా మాత్రమే మార్చదు; +ముందు ఒకే పదానికి చెందిన subword tokens ను మళ్లీ కలిపి, చదవగలిగే వాక్యంగా మార్చుతుంది. +ఈ ప్రవర్తన, text జనరేషన్ చేసే మోడళ్లతో పని చేస్తున్నప్పుడు (prompt నుంచి text ఉత్పత్తి చేయడం, లేదా translation, summarization వంటి sequence-to-sequence సమస్యల్లో) చాలా ఉపయోగకరంగా ఉంటుంది. + +ఇప్పటికే టోకనైజర్ చేయగలిగే atomic operations — tokenization, IDs కు మార్పు, మరియు IDs ను తిరిగి string గా మార్చడం — మీకు అర్థమై ఉండాలి. +అయితే ఇది ఐస్‌బర్గ్ పైభాగం మాత్రమే. తదుపరి విభాగంలో, ఈ విధానాన్ని గరిష్ట స్థాయికి తీసుకెళ్లి, దానివల్ల వచ్చే పరిమితులను ఎలా అధిగమించాలో చూస్తాం. \ No newline at end of file diff --git a/chapters/te/chapter2/5.mdx b/chapters/te/chapter2/5.mdx new file mode 100644 index 000000000..0989eb5bc --- /dev/null +++ b/chapters/te/chapter2/5.mdx @@ -0,0 +1,227 @@ + + +# బహుళ సీక్వెన్స్‌ల నిర్వహణ[[handling-multiple-sequences]] + + + + + +మునుపటి విభాగంలో, చిన్న పొడవు ఉన్న ఒకే సీక్వెన్స్‌పై inference చేయడం లాంటి అత్యంత సరళమైన ఉపయోగం చూశాం. కానీ అక్కడే కొన్ని ప్రశ్నలు వస్తాయి: + +- బహుళ సీక్వెన్స్‌లను ఎలా హ్యాండిల్ చేస్తాం? +- *భిన్నమైన పొడవు* ఉన్న బహుళ సీక్వెన్స్‌లను ఎలా హ్యాండిల్ చేస్తాం? +- vocabulary indices (input IDs) మాత్రమే మోడల్ బాగా పని చేయడానికి సరిపోతాయా? +- సీక్వెన్స్ చాలా ఎక్కువగా ఉండటం కూడా సమస్యగా మారుతుందా? + +ఇప్పుడు ఈ ప్రశ్నలు ఏరకమైన సమస్యలను కలిగిస్తాయో, వాటిని 🤗 Transformers API తో ఎలా పరిష్కరించాలో చూద్దాం. + +## మోడళ్లు batch రూపంలో ఇన్‌పుట్‌లను ఆశిస్తాయి[[models-expect-a-batch-of-inputs]] + +మునుపటి exercise లో, సీక్వెన్స్‌లు సంఖ్యల జాబితాగా ఎలా మారతాయో చూశారు. +ఇప్పుడు ఆ సంఖ్యల జాబితాను టెన్సర్‌గా మార్చి మోడల్‌కి పంపుదాం: + +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) +input_ids = torch.tensor(ids) +# This line will fail. +model(input_ids) +``` + +```python out +IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1) +``` +అయ్యో! ఇది ఎందుకు fail అయింది? సెక్షన్ 2 లో pipeline ఉపయోగించిన స్టెప్పులనే ఇక్కడ కూడా పాటించాం కదా. + +సమస్య ఏమిటంటే, మనం మోడల్‌కి ఒక్క సీక్వెన్స్ మాత్రమే పంపాం, కానీ 🤗 Transformers మోడళ్లు default గా బహుళ వాక్యాలను (multiple sentences) ఆశిస్తాయి. +ఇక్కడ మనం tokenizer `sequence` మీద వెనుకపట్లో చేసే పని మనమే చేతితో చేయడానికి ప్రయత్నించాం. కానీ బాగా గమనిస్తే, tokenizer input IDs లిస్ట్‌ను టెన్సర్‌గా మార్చడమే కాకుండా, దానిపై అదనంగా ఒక dimension కూడా వేసింది: + +```py +tokenized_inputs = tokenizer(sequence, return_tensors="pt") +print(tokenized_inputs["input_ids"]) +``` + +```python out +tensor([[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, + 2607, 2026, 2878, 2166, 1012, 102]]) +``` + +ఇప్పుడు మనమే ఆ కొత్త dimension ను జోడించి మళ్లీ ప్రయత్నిద్దాం: + +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) + +input_ids = torch.tensor([ids]) +print("Input IDs:", input_ids) + +output = model(input_ids) +print("Logits:", output.logits) +``` + +ఇప్పుడు input IDs ని, అలాగే లభించిన logits ని ప్రింట్ చేస్తాం — అవి ఈ విధంగా ఉంటాయి: + +```python out +Input IDs: [[ 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012]] +Logits: [[-2.7276, 2.8789]] +``` + +*Batching* అంటే, ఒకేసారి బహుళ వాక్యాలను (multiple sentences) మోడల్‌కి పంపడం. +మీ దగ్గర ఒక్క sentence మాత్రమే ఉన్నా, ఆ ఒక్క సీక్వెన్స్‌తోనే ఒక batch నిర్మించవచ్చు: + +``` +batched_ids = [ids, ids] +``` + +ఇది ఇప్పుడు రెండు ఒకే సీక్వెన్స్‌లను కలిగిన ఒక batch! + + + +✏️ **ప్రయత్నించండి!** ఈ `batched_ids` లిస్ట్‌ను టెన్సర్‌గా మార్చి మీ మోడల్‌లోకి పంపండి. +ముందు వచ్చిన logits మాదిరిగానే (కానీ రెండుసార్లు) వస్తున్నాయో చూడండి! + + + +Batching ద్వారా, మీరు బహుళ వాక్యాలను మోడల్‌కి పంపినప్పుడు అది సరిగ్గా పని చేస్తుంది. +ఒక సీక్వెన్స్‌తో batch తయారుచేసినట్లే, బహుళ సీక్వెన్స్‌లతో కూడా batch తయారుచేయడం అంతే సులభం. + +కానీ ఇక్కడ రెండో సమస్య వస్తుంది: మీరు రెండు (లేదా అంతకంటే ఎక్కువ) వాక్యాలను batch లో కలపాలనుకుంటే, అవి ఒక్కోటి ఒక్కో పొడవు (length) లో ఉండవచ్చు. +టెన్సర్‌లతో ముందే పని చేసి ఉంటే, అవి rectangular shape లో ఉండాల్సిందేనని మీకు తెలుసు; కాబట్టి input IDs జాబితాను నేరుగా టెన్సర్‌గా మార్చలేం. +ఈ సమస్యను పరిష్కరించడానికి, సాధారణంగా మనం ఇన్‌పుట్‌లను *pad* చేస్తాం. + +## ఇన్‌పుట్‌లను padding చేయడం[[padding-the-inputs]] + +క్రింద ఉన్న list of lists ను నేరుగా టెన్సర్‌గా మార్చలేం: + +```py no-format +batched_ids = [ + [200, 200, 200], + [200, 200] +] +``` + +దీనిని పరిష్కరించడానికి, మనం *padding* ఉపయోగిస్తాం, తద్వారా టెన్సర్‌లు rectangular shape లో ఉంటాయి. +Padding ద్వారా, అన్ని వాక్యాలూ ఒకే పొడవు కలిగేలా, తక్కువ పదాలు ఉన్న వాక్యాలకు ప్రత్యేక పదమైన *padding token* ను చివరలో జోడిస్తాం. +ఉదాహరణకు, 10 వాక్యాలు ఒక్కోటి 10 పదాలతో ఉండి, మరో ఒక వాక్యం 20 పదాలతో ఉందనుకోండి; padding చేసిన తర్వాత, అన్ని వాక్యాలూ 20 పదాలు కలిగి ఉంటాయి. +మన ఉదాహరణలో, చివరికి వచ్చిన టెన్సర్ ఇలా కనిపిస్తుంది: + +```py no-format +padding_id = 100 + +batched_ids = [ + [200, 200, 200], + [200, 200, padding_id], +] +``` + +Padding token యొక్క ID ని `tokenizer.pad_token_id` లో చూడవచ్చు. +ఇప్పుడిదాన్ని ఉపయోగించి, మన రెండు వాక్యాలను ఒక్కోసారి విడివిడిగా, అలాగే batch గా కలిపి మోడల్‌లోకి పంపుదాం: + +```py no-format +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence1_ids = [[200, 200, 200]] +sequence2_ids = [[200, 200]] +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +print(model(torch.tensor(sequence1_ids)).logits) +print(model(torch.tensor(sequence2_ids)).logits) +print(model(torch.tensor(batched_ids)).logits) +``` + +```python out +tensor([[ 1.5694, -1.3895]], grad_fn=) +tensor([[ 0.5803, -0.4125]], grad_fn=) +tensor([[ 1.5694, -1.3895], + [ 1.3373, -1.2163]], grad_fn=) +``` + +ఇక్కడ batched predictions లో logits లో ఏదో తేడా ఉంది: రెండో row, రెండో వాక్యాన్ని విడిగా పంపినప్పుడు వచ్చిన logits మాదిరిగానే ఉండాలి, కానీ పూర్తిగా వేరు values వచ్చాయి! + +దీనికి కారణం, Transformer మోడళ్లలో ప్రధాన పాత్ర పోషించే attention layers — ఇవి ప్రతి token ను దాని *context* తో కలిపి చూడడానికి ప్రయత్నిస్తాయి. +ఇవి padding tokens ను కూడా గమనిస్తాయి, ఎందుకంటే అవి సీక్వెన్స్‌లోని అన్ని tokens పై దృష్టి పెడతాయి. +కాబట్టి, వేర్వేరు పొడవు ఉన్న వాక్యాలను విడిగా మోడల్‌కి పంపినా, అదే వాక్యాలను padding తో కూడిన batch గా పంపినా, ఒకే ఫలితాలు రావాలంటే, attention layers‌కు padding tokens ను *పట్టించుకోవద్దు* అని చెప్పాలి. ఇది *attention mask* ద్వారా చేస్తాం. + +## Attention masks[[attention-masks]] + +*Attention mask* అనేది input IDs టెన్సర్‌కి అచ్చం అదే రూపంలో ఉండే టెన్సర్, కానీ 0లూ 1లతో నిండినది: +1 ఉన్న స్థానాల్లోని tokens పై మోడల్ దృష్టి పెట్టాలి, 0 ఉన్న స్థానాల్లోని tokens ను దృష్టి పెట్టకూడదు (అంటే, ఆ tokens ను attention layers పూర్తిగా *ignore* చేయాలి). + +ఇప్పుడు ముందున్న ఉదాహరణకే ఒక attention mask జోడిద్దాం: + +```py no-format +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +attention_mask = [ + [1, 1, 1], + [1, 1, 0], +] + +outputs = model(torch.tensor(batched_ids), attention_mask=torch.tensor(attention_mask)) +print(outputs.logits) +``` + +```python out +tensor([[ 1.5694, -1.3895], + [ 0.5803, -0.4125]], grad_fn=) +``` + +ఇప్పుడు batch లో రెండో వాక్యానికి వచ్చిన logits, ఆ వాక్యాన్ని విడిగా పంపినప్పుడు వచ్చిన logits‌ల మాదిరిగానే ఉన్నాయి. + +గమనించండి: రెండో సీక్వెన్స్ లో చివరి విలువ padding ID కి సంబంధించినది; దానికి attention mask లో 0 ఉంది. + + + +✏️ **ప్రయత్నించండి!** సెక్షన్ 2 లో ఉపయోగించిన రెండు వాక్యాల (`"I've been waiting for a HuggingFace course my whole life."` మరియు `"I hate this so much!"`) మీద టోకనైజేషన్‌ను చేతితో చేయండి. +వాటిని మోడల్‌కి విడివిడిగా పంపి, సెక్షన్ 2 లో వచ్చిన logits మాదిరిగానే వస్తున్నాయో చూసుకోండి. +తర్వాత వాటిని padding token తో కలిపి ఒక batch చేయండి, సరైన attention mask నిర్మించండి, మళ్లీ మోడల్‌లోకి పంపి ఫలితాలు ఒకటేనా చూడండి! + + + +## పొడవైన సీక్వెన్స్‌లు[[longer-sequences]] + +Transformer మోడళ్లతో పని చేసేప్పుడు, మోడల్ అంగీకరించే సీక్వెన్స్‌ల పొడవుకు ఒక పరిమితి ఉంటుంది. +చాలా మోడళ్లు గరిష్టంగా 512 లేదా 1024 tokens వరకు మాత్రమే సీక్వెన్స్‌లను హ్యాండిల్ చేయగలవు; అంతకంటే పొడవైన సీక్వెన్స్‌లను పంపితే, అవి క్రాష్ కావచ్చు. +ఈ సమస్యకు రెండు పరిష్కారాలు ఉన్నాయి: + +- పొడవైన సీక్వెన్స్‌లను సపోర్ట్ చేసే మోడల్ ఉపయోగించడం. +- మీ సీక్వెన్స్‌లను truncation ద్వారా చిన్నవిగా కత్తిరించడం. + +వివిధ మోడళ్లకు వివిధ గరిష్ట సీక్వెన్స్ పొడవులు ఉంటాయి; కొన్ని మోడళ్లు చాలా పొడవైన సీక్వెన్స్‌ల కోసం ప్రత్యేకంగా రూపొందించబడ్డాయి. +ఉదాహరణకు, [Longformer](https://huggingface.co/docs/transformers/model_doc/longformer), [LED](https://huggingface.co/docs/transformers/model_doc/led) లాంటి మోడళ్లు. +మీ పని చాలా పొడవైన సీక్వెన్స్‌లను అవసరం చేసుకుంటే, ఇటువంటి మోడళ్లపై ఒకసారి పరిశీలించమని సూచిస్తాము. + +లేదంటే, మీ సీక్వెన్స్‌లను truncate చేయడం మంచిది; దానికి `max_sequence_length` పరామీటర్‌ను ఇవ్వవచ్చు: + +```py +sequence = sequence[:max_sequence_length] +``` diff --git a/chapters/te/chapter2/6.mdx b/chapters/te/chapter2/6.mdx new file mode 100644 index 000000000..afba9f119 --- /dev/null +++ b/chapters/te/chapter2/6.mdx @@ -0,0 +1,146 @@ + + +# అన్నింటినీ కలిపి చూడడం[[putting-it-all-together]] + + + +గత కొద్ది విభాగాల్లో, ఎక్కువ భాగం పనిని మన చేతులతో చేయడానికి ప్రయత్నించాం. +టోకెనైజర్లు ఎలా పని చేస్తాయో చూశాం, tokenization, input IDs మార్పు, padding, truncation, attention masks వంటి దశలను పరిశీలించాము. + +అయితే, సెక్షన్ 2 లో చూసినట్లుగా, 🤗 Transformers APIలోని ఒక high-level ఫంక్షన్ ఈ అన్నింటినీ మన కోసం ఆటోమేటిక్‌గా చేయగలదు. +మీరు `tokenizer` ను నేరుగా వాక్యం మీద కాల్ చేస్తే, మోడల్‌కు పంపడానికి సిద్ధమైన ఇన్‌పుట్‌లు మీకు లభిస్తాయి: + +```py +from transformers import AutoTokenizer + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +``` + +ఇక్కడ `model_inputs` వేరియబుల్‌లో మోడల్ సరిగ్గా పనిచేయడానికి అవసరమైన ప్రతి అంశం ఉంటుంది. DistilBERT కోసం, ఇందులో input IDs అలాగే attention mask ఉంటాయి. +ఇతర మోడళ్లకు అదనపు ఇన్‌పుట్‌లు అవసరమైతే, tokenizer వాటినీ కూడా తయారు చేస్తుంది. + +క్రింది ఉదాహరణల్లో చూస్తున్నట్లుగా, ఈ విధానం చాలా శక్తివంతమైనది. మొదటగా, ఇది ఒకే సీక్వెన్స్‌ను tokenize చేయగలదు: + +```py +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +``` + +అదే విధంగా, APIలో ఎలాంటి మార్పు లేకుండా బహుళ సీక్వెన్స్‌లను కూడా tokenize చేయగలదు: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +model_inputs = tokenizer(sequences) +``` + +ఇది padding‌ను కూడా వివిధ లక్ష్యాల ప్రకారం నిర్వహించగలదు: + +```py +# Will pad the sequences up to the maximum sequence length +model_inputs = tokenizer(sequences, padding="longest") + +# Will pad the sequences up to the model max length +# (512 for BERT or DistilBERT) +model_inputs = tokenizer(sequences, padding="max_length") + +# Will pad the sequences up to the specified max length +model_inputs = tokenizer(sequences, padding="max_length", max_length=8) +``` + +ఇది సీక్వెన్స్‌లను truncate కూడా చేయగలదు: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +# Will truncate the sequences that are longer than the model max length +# (512 for BERT or DistilBERT) +model_inputs = tokenizer(sequences, truncation=True) + +# Will truncate the sequences that are longer than the specified max length +model_inputs = tokenizer(sequences, max_length=8, truncation=True) +``` + +`tokenizer` ఆబ్జెక్ట్ ప్రత్యేక framework టెన్సర్లు (TensorFlow, PyTorch, NumPy) గా మార్పు చేయడం కూడా నిర్వహిస్తుంది. +ఉదాహరణకు, క్రింది కోడ్‌లో `"pt"` అంటే PyTorch టెన్సర్లు, `"np"` అంటే NumPy arrays: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +# Returns PyTorch tensors +model_inputs = tokenizer(sequences, padding=True, return_tensors="pt") + +# Returns NumPy arrays +model_inputs = tokenizer(sequences, padding=True, return_tensors="np") +``` + +## ప్రత్యేక tokens[[special-tokens]] + +టోకెనైజర్ ఇచ్చిన input IDs ను పరిశీలిస్తే, అవి ముందుగా చూసిన IDs కంటే కొద్దిగా భిన్నంగా ఉంటాయి: + +```py +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +print(model_inputs["input_ids"]) + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) +print(ids) +``` + +```python out +[101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102] +[1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012] +``` + +ఆ input IDs ను decode చేసి చూస్తే విషయం స్పష్టమవుతుంది: + +```py +print(tokenizer.decode(model_inputs["input_ids"])) +print(tokenizer.decode(ids)) +``` + +```python out +"[CLS] i've been waiting for a huggingface course my whole life. [SEP]" +"i've been waiting for a huggingface course my whole life." +``` + +టోకెనైజర్ ప్రారంభంలో `[CLS]`, చివరలో `[SEP]` అనే ప్రత్యేక పదాలను జోడించింది. +దానికి కారణం — ఆ మోడల్ ప్రీట్రైనింగ్ సమయంలో ఈ tokens ను ఉపయోగించింది, కాబట్టి inference సమయంలో కూడా అవి అవసరం అవుతాయి. + +గమనించండి: +అన్ని మోడళ్లు ఇలాంటి ప్రత్యేక tokens ను జోడించవు. +కొన్ని మోడళ్లు వేర్వేరు special tokens ఉపయోగిస్తాయి. +కొన్నిసార్లు ప్రారంభంలో మాత్రమే, కొన్నిసార్లు చివరలో మాత్రమే జోడిస్తాయి. + +ఏ మోడల్ ఏ tokens ను కోరుకుంటుందో tokenizer కు పూర్తిగా తెలుసు — దాన్ని అది మీ కోసం నిర్వహిస్తుంది. + +## ముగింపు: Tokenizer నుండి Model వరకు[[wrapping-up-from-tokenizer-to-model]] + +ఇప్పుడు `tokenizer` టెక్స్ట్‌పై పనిచేసేటప్పుడు follow అయ్యే ప్రతి దశ గురించి తెలుసుకున్నాం. +చివరిసారి, ఇది padding (బహుళ సీక్వెన్స్‌లు!), truncation (పొడవైన సీక్వెన్స్‌లు!), మరియు framework టెన్సర్లను ఎలా నిర్వహిస్తుందో చూద్దాం: + +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt") +output = model(**tokens) +``` diff --git a/chapters/te/chapter2/7.mdx b/chapters/te/chapter2/7.mdx new file mode 100644 index 000000000..ebc872230 --- /dev/null +++ b/chapters/te/chapter2/7.mdx @@ -0,0 +1,19 @@ +# ప్రాథమిక వినియోగం పూర్తయింది![[basic-usage-completed]] + + + +ఇంత వరకూ కోర్సును అద్భుతంగా అనుసరించారు! ఈ అధ్యాయంలో మీరు చేసిన విషయాలను ఒకసారి సమీక్షిద్దాం: + +- Transformer మోడల్ యొక్క ప్రాథమిక భాగాలను నేర్చుకున్నారు. +- ఒక tokenization పైప్‌లైన్‌లో ఏమేం ఉంటాయో తెలుసుకున్నారు. +- Transformer మోడల్‌ను ప్రాక్టికల్‌గా ఎలా ఉపయోగించాలో చూశారు. +- టెక్స్ట్‌ను మోడల్‌కి అర్థమయ్యే టెన్సర్లుగా మార్చడానికి tokenizer ను ఎలా ఉపయోగించాలో నేర్చుకున్నారు. +- టోకనైజర్ మరియు మోడల్‌ను కలిసి సెటప్ చేసి, టెక్స్ట్ నుండి predictions తీసుకొచ్చారు. +- Input IDs యొక్క పరిమితులను, మరియు attention masks అవసరం ఎందుకుందో తెలుసుకున్నారు. +- వివిధ రకాలుగా ఉపయోగించగల, అత్యంత అనుకూలీకరణకు వీలైన tokenizer methods తో ప్రయోగాలు చేశారు. + +ఇప్పటి నుంచి, 🤗 Transformers డాక్యుమెంటేషన్‌ను మీరు స్వేచ్ఛగా అన్వేషించగలరు: +అందులోని పదజాలం (vocabulary) మీకు పరిచయంగా ఉంటుంది, మరియు మీరు ఎక్కువగా ఉపయోగించే పద్ధతులను ఇప్పటికే చూశారు. diff --git a/chapters/te/chapter2/8.mdx b/chapters/te/chapter2/8.mdx new file mode 100644 index 000000000..3974ef2d0 --- /dev/null +++ b/chapters/te/chapter2/8.mdx @@ -0,0 +1,878 @@ +# ఆప్టిమైజ్డ్ ఇన్ఫరెన్స్ డిప్లాయ్‌మెంట్ + +ఈ విభాగంలో, LLM deployments ను ఆప్టిమైజ్ చేయడానికి ఉపయోగించే ఆధునిక frameworks అయిన Text Generation Inference (TGI), vLLM, మరియు llama.cpp గురించి తెలుసుకుందాం. +ఈ అప్లికేషన్లు ముఖ్యంగా production పరిసరాల్లో LLMలను వినియోగదారులకు సర్వ్ చేయడానికి ఉపయోగిస్తారు. ఈ విభాగం ఒకే మెషిన్‌పై inference ఎలా చేయాలో కాదు, production లో ఈ frameworks ను ఎలా deploy చేయాలో మీద దృష్టి పెడుతుంది. + +ఈ tools inference సామర్థ్యాన్ని ఎలా గరిష్టం చేస్తాయి మరియు Large Language Models యొక్క production deployments ను ఎలా సులభతరం చేస్తాయి అనే విషయాలపై చర్చిస్తాం. + +## Framework ఎంపిక గైడ్ + +TGI, vLLM, మరియు llama.cpp ఒకే విధమైన లక్ష్యంతో పనిచేస్తున్నా, ప్రతి framework కి వేర్వేరు లక్షణాలు ఉన్నాయి, ఇవి ప్రత్యేక use cases కు బాగా సరిపోతాయి. +ఇప్పుడు, వాటి ప్రధాన తేడాలను — ముఖ్యంగా performance మరియు integration పరంగా — పరిశీలిద్దాం. + +### మెమరీ మేనేజ్‌మెంట్ మరియు పనితీరు + +**TGI** production కోసం స్థిరమైన, predictable ప్రవర్తన అందించేలా రూపొందించబడింది. ఇది GPU మెమరీ వినియోగాన్ని స్థిరంగా ఉంచేందుకు fixed sequence lengths ఉపయోగిస్తుంది. +TGI, Flash Attention 2 మరియు continuous batching వంటి పద్ధతులతో మెమరీని సమర్థవంతంగా నిర్వహిస్తుంది. దీనివల్ల attention calculations వేగవంతమవుతాయి మరియు GPU నిరుత్సాహంగా ఉండే సమయం తగ్గుతుంది. +అవసరమైతే, సిస్టమ్ మోడల్‌లోని కొన్ని భాగాలను CPU మరియు GPU మధ్య మార్చగలదు, ఇది పెద్ద మోడళ్లను కూడా హ్యాండిల్ చేయడానికి సహాయపడుతుంది. + +Flash Attention + + + +Flash Attention అనేది transformer models లోని attention mechanism ను ఆప్టిమైజ్ చేయడానికి ఉపయోగించే సాంకేతికత. +మనం [అధ్యాయం 1.8](/course/chapter1/8) లో చర్చించినట్టుగా, attention కి quadratic complexity ఉండటం వలన, దీని computation మరియు memory వినియోగం ఎక్కువగా ఉంటుంది. + +Flash Attention యొక్క ప్రధాన ఆవిష్కరణ HBM (High Bandwidth Memory) మరియు SRAM cache మధ్య memory transfer ను తగ్గించడంలో ఉంది. సాధారణ attention లో ఈ transfers చాలా సార్లు జరుగుతూ bottleneck అవుతాయి. +Flash Attention డేటాను ఒక్కసారి SRAM లోకి లోడ్ చేసి, calculations అంతా అక్కడే పూర్తి చేస్తుంది, దాంతో memory overhead చాలా తగ్గుతుంది. + +ఈ ప్రయోజనాలు training సమయంలో ఎక్కువగా కనిపించినా, inference సమయంలో కూడా VRAM వినియోగం తగ్గడం మరియు వేగం పెరగడం వంటి ప్రయోజనాలు అందిస్తుంది. + + + +**vLLM** పూర్తిగా వేరు విధానాన్ని అనుసరిస్తుంది — దీని ప్రత్యేకత *PagedAttention*. +ఇది కంప్యూటర్ virtual memory లానే పనిచేస్తుంది: మోడల్ memory ను చిన్న చిన్న “pages” గా విభజిస్తుంది. దీని ద్వారా requests వేర్వేరు sizes అయినా memory ని వృథా చేయకుండా హ్యాండిల్ చేయవచ్చు. +ఇది memory fragmentation ను తగ్గిస్తూ, KV cache ను సమర్థవంతంగా నిర్వహిస్తుంది, తద్వారా throughput భారీగా పెరుగుతుంది. + + + +PagedAttention, KV cache నిర్వహణలో ఉండే bottlenecks ను పరిష్కరించడానికి రూపొందించబడింది. +LLM generation సమయంలో, ప్రతి token కి keys మరియు values (KV cache) నిల్వ చేయాలి. దీని memory చాలా పెద్దది అవుతుంది — ముఖ్యంగా long sequences లేదా concurrent requests వద్ద. + +vLLM యొక్క కీలక ఆవిష్కరణలు ఇవి: + +1. **Memory Paging** – KV cache ను పెద్ద continuous block లాగా కాకుండా చిన్న pages గా విభజించడం +2. **Non-contiguous Storage** – GPU memory లో pages continuous గా ఉండాల్సిన అవసరం లేదు +3. **Page Table** – ఏ pages ఏ sequence కు చెందినవి అనే సమాచారం నిర్వహించడం +4. **Memory Sharing** – ఒక prompt కి సంబంధించిన KV cache pages ని అనేక sequences మధ్య share చేయడం + +ఈ పద్ధతి సంప్రదాయ inference పద్ధతుల కంటే *24x వరకు* ఎక్కువ throughput అందించగలదు. +వివరంగా తెలుసుకోవాలంటే, [vLLM documentation](https://docs.vllm.ai/en/latest/design/kernel/paged_attention.html) చదవవచ్చు. + + + +**llama.cpp** అనేది అత్యంత ఆప్టిమైజ్ చేయబడిన C/C++ implementation. మొదట ఇది consumer hardware పై LLaMA మోడళ్లను రన్ చేయడానికి రూపొందించబడింది. +ఇది CPU పై అత్యంత సమర్థవంతంగా పనిచేస్తుంది, అవసరమైతే GPU acceleration కూడా అందిస్తుంది. +llama.cpp మోడల్ ను quantize చేసి చిన్న పరిమాణంలోకి మార్చుతుంది — అలా VRAM వినియోగం తగ్గి inference వేగం పెరుగుతుంది. + + + +Quantization అనేది మోడల్ weights ను FP32/FP16 నుండి తక్కువ precision (INT8, 4-bit మొదలైనవి) కు మార్చే ప్రక్రియ. +ఇది memory వినియోగాన్ని గణనీయంగా తగ్గించి inference వేగాన్ని పెంచుతుంది., accuracy లో తక్కువ నష్టం మాత్రమే ఉంటుంది. + +llama.cpp లోని ముఖ్యమైన quantization ప్రయోజనాలు: + +1. **అనేక precision స్థాయిలు** – INT8, 4-bit, 3-bit, 2-bit వరకు +2. **GGML/GGUF ఫార్మాట్లు** – quantized inference కోసం ఆప్టిమైజ్ చేసిన టెన్సర్ ఫార్మాట్లు +3. **Mixed precision** – మోడల్‌లో వేర్వేరు భాగాలకు వేర్వేరు quantization స్థాయిలు +4. **CPU optimizations** – AVX2, AVX-512, NEON వంటి CPU నిర్మాణాల (architectures) కోసం ఆప్టిమైజ్ చేసిన kernels + +ఈ విధానం, తక్కువ memory ఉన్న consumer devices పై కూడా పెద్ద మోడళ్లను రన్ చేయడానికి మార్గాన్ని అందిస్తుంది. + + + +### Deployment మరియు Integration + +ఇప్పుడు frameworks deployment మరియు integration పరంగా ఎలా భిన్నంగా ఉన్నాయో చూద్దాం. + +**TGI** enterprise-స్థాయి deployment లో అత్యుత్తమం. +ఇది production కి అవసరమైన వాటిని built-in గా అందిస్తుంది — Kubernetes support, monitoring (Prometheus/Grafana), autoscaling, content filtering, rate limiting, security features మొదలైనవి. +అంతేకాకుండా enterprise-grade logging కూడా కలిగి ఉంది. + +**vLLM** flexible మరియు developer-friendly గా రూపొందించబడింది. +ఇది Python ఆధారంగా పనిచేస్తుంది మరియు మీ existing applications లో OpenAI API స్థానంలో సులభంగా plug చేయవచ్చు. +Clusters నిర్వహణ కోసం Ray తో బాగా పని చేస్తుంది. + +**llama.cpp** సాదాసీదా, తేలికైన server implementation కలిగి ఉంది. +Python frameworks ను install చేయడం కష్టమైన పరిసరాల్లో కూడా deployment సులభం. +ఇది OpenAI-compatible API కూడా అందిస్తుంది, కానీ resource వినియోగం చాలా తక్కువ. + +## ప్రారంభించడం + +ఇప్పుడు ఈ frameworks ను ఎలా ఉపయోగించాలో — సంస్థాపన (installation) నుండి deployment వరకూ — చూద్దాం. + +### సంస్థాపన మరియు ప్రాథమిక సెటప్ + + + + + +TGI ను Hugging Face ecosystem తో బాగా integrate చేశారు, మరియు సంస్థాపన చాలా సులభం. + +మొదట, Docker తో TGI server ను ప్రారంభించండి: + +```sh +docker run --gpus all \ + --shm-size 1g \ + -p 8080:80 \ + -v ~/.cache/huggingface:/data \ + ghcr.io/huggingface/text-generation-inference:latest \ + --model-id HuggingFaceTB/SmolLM2-360M-Instruct +``` + +తరువాత Hugging Face InferenceClient తో ఇంటరాక్ట్ అవండి: + +```python +from huggingface_hub import InferenceClient + +# Initialize client pointing to TGI endpoint +client = InferenceClient( + model="http://localhost:8080", # URL to the TGI server +) + +# Text generation +response = client.text_generation( + "Tell me a story", + max_new_tokens=100, + temperature=0.7, + top_p=0.95, + details=True, + stop_sequences=[], +) +print(response.generated_text) + +# For chat format +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + +లేదా OpenAI client ఉపయోగించవచ్చు: + +```python +from openai import OpenAI + +# Initialize client pointing to TGI endpoint +client = OpenAI( + base_url="http://localhost:8080/v1", # Make sure to include /v1 + api_key="not-needed", # TGI doesn't require an API key by default +) + +# Chat completion +response = client.chat.completions.create( + model="HuggingFaceTB/SmolLM2-360M-Instruct", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + + + + + +llama.cpp సంస్థాపన చాలా తేలికగా ఉంటుంది; CPU మరియు GPU inference రెండింటిని సపోర్ట్ చేస్తుంది. + +మొదట, llama.cpp ని build చేయండి: + +```sh +# Clone the repository +git clone https://github.com/ggerganov/llama.cpp +cd llama.cpp + +# Build the project +make + +# Download the SmolLM2-1.7B-Instruct-GGUF model +curl -L -O https://huggingface.co/HuggingFaceTB/SmolLM2-1.7B-Instruct-GGUF/resolve/main/smollm2-1.7b-instruct.Q4_K_M.gguf +``` + +OpenAI-compatible server ను ప్రారంభించండి: + +```sh +# Start the server +./server \ + -m smollm2-1.7b-instruct.Q4_K_M.gguf \ + --host 0.0.0.0 \ + --port 8080 \ + -c 4096 \ + --n-gpu-layers 0 # Set to a higher number to use GPU +``` + +InferenceClient తో interact చేయండి: + +```python +from huggingface_hub import InferenceClient + +# Initialize client pointing to llama.cpp server +client = InferenceClient( + model="http://localhost:8080/v1", # URL to the llama.cpp server + token="sk-no-key-required", # llama.cpp server requires this placeholder +) + +# Text generation +response = client.text_generation( + "Tell me a story", + max_new_tokens=100, + temperature=0.7, + top_p=0.95, + details=True, +) +print(response.generated_text) + +# For chat format +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + +లేదా OpenAI client ఉపయోగించండి: + +```python +from openai import OpenAI + +# Initialize client pointing to llama.cpp server +client = OpenAI( + base_url="http://localhost:8080/v1", + api_key="sk-no-key-required", # llama.cpp server requires this placeholder +) + +# Chat completion +response = client.chat.completions.create( + model="smollm2-1.7b-instruct", # Model identifier can be anything as server only loads one model + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + + + + + +vLLM సంస్థాపన కూడా అత్యంత సులభం. ఇది OpenAI-compatible API మరియు native Python interface రెండింటినీ అందిస్తుంది. + +మొదట, vLLM server ను ప్రారంభించండి: + +```sh +python -m vllm.entrypoints.openai.api_server \ + --model HuggingFaceTB/SmolLM2-360M-Instruct \ + --host 0.0.0.0 \ + --port 8000 +``` + +InferenceClient తో ఉపయోగించండి: + +```python +from huggingface_hub import InferenceClient + +# Initialize client pointing to vLLM endpoint +client = InferenceClient( + model="http://localhost:8000/v1", # URL to the vLLM server +) + +# Text generation +response = client.text_generation( + "Tell me a story", + max_new_tokens=100, + temperature=0.7, + top_p=0.95, + details=True, +) +print(response.generated_text) + +# For chat format +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + +లేదా OpenAI client: + +```python +from openai import OpenAI + +# Initialize client pointing to vLLM endpoint +client = OpenAI( + base_url="http://localhost:8000/v1", + api_key="not-needed", # vLLM doesn't require an API key by default +) + +# Chat completion +response = client.chat.completions.create( + model="HuggingFaceTB/SmolLM2-360M-Instruct", + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Tell me a story"}, + ], + max_tokens=100, + temperature=0.7, + top_p=0.95, +) +print(response.choices[0].message.content) +``` + + + + + +### ప్రాథమిక టెక్స్ట్ జనరేషన్ + +ఇప్పుడు frameworks లో text generation ఎలా చేయాలో చూద్దాం. + + + + + +మొదట, అభివృద్ధి చెందిన parameters తో TGI deploy చేయండి: + +```sh +docker run --gpus all \ + --shm-size 1g \ + -p 8080:80 \ + -v ~/.cache/huggingface:/data \ + ghcr.io/huggingface/text-generation-inference:latest \ + --model-id HuggingFaceTB/SmolLM2-360M-Instruct \ + --max-total-tokens 4096 \ + --max-input-length 3072 \ + --max-batch-total-tokens 8192 \ + --waiting-served-ratio 1.2 +``` + +InferenceClient తో generation చేయండి: + +```python +from huggingface_hub import InferenceClient + +client = InferenceClient(model="http://localhost:8080") + +# Advanced parameters example +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, + max_tokens=200, + top_p=0.95, +) +print(response.choices[0].message.content) + +# Raw text generation +response = client.text_generation( + "Write a creative story about space exploration", + max_new_tokens=200, + temperature=0.8, + top_p=0.95, + repetition_penalty=1.1, + do_sample=True, + details=True, +) +print(response.generated_text) +``` + +లేదా OpenAI client: +```python +from openai import OpenAI + +client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed") + +# Advanced parameters example +response = client.chat.completions.create( + model="HuggingFaceTB/SmolLM2-360M-Instruct", + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, # Higher for more creativity +) +print(response.choices[0].message.content) +``` + + + + + +llama.cpp లో server launch సమయంలో advanced parameters సెట్ చేయవచ్చు: + +```sh +./server \ + -m smollm2-1.7b-instruct.Q4_K_M.gguf \ + --host 0.0.0.0 \ + --port 8080 \ + -c 4096 \ # Context size + --threads 8 \ # CPU threads to use + --batch-size 512 \ # Batch size for prompt evaluation + --n-gpu-layers 0 # GPU layers (0 = CPU only) +``` + +InferenceClient తో ఉపయోగించండి: + +```python +from huggingface_hub import InferenceClient + +client = InferenceClient(model="http://localhost:8080/v1", token="sk-no-key-required") + +# Advanced parameters example +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, + max_tokens=200, + top_p=0.95, +) +print(response.choices[0].message.content) + +# For direct text generation +response = client.text_generation( + "Write a creative story about space exploration", + max_new_tokens=200, + temperature=0.8, + top_p=0.95, + repetition_penalty=1.1, + details=True, +) +print(response.generated_text) +``` + +లేదా నమూనా పారామితులపై నియంత్రణతో జనరేషన్ కోసం OpenAI క్లయింట్‌ని ఉపయోగించండి: + +```python +from openai import OpenAI + +client = OpenAI(base_url="http://localhost:8080/v1", api_key="sk-no-key-required") + +# Advanced parameters example +response = client.chat.completions.create( + model="smollm2-1.7b-instruct", + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, # Higher for more creativity + top_p=0.95, # Nucleus sampling probability + frequency_penalty=0.5, # Reduce repetition of frequent tokens + presence_penalty=0.5, # Reduce repetition by penalizing tokens already present + max_tokens=200, # Maximum generation length +) +print(response.choices[0].message.content) +``` + +అదనంగా, llama.cpp native library తో మరింత నియంత్రణ పొందవచ్చు: + +```python +# Using llama-cpp-python package for direct model access +from llama_cpp import Llama + +# Load the model +llm = Llama( + model_path="smollm2-1.7b-instruct.Q4_K_M.gguf", + n_ctx=4096, # Context window size + n_threads=8, # CPU threads + n_gpu_layers=0, # GPU layers (0 = CPU only) +) + +# Format prompt according to the model's expected format +prompt = """<|im_start|>system +You are a creative storyteller. +<|im_end|> +<|im_start|>user +Write a creative story +<|im_end|> +<|im_start|>assistant +""" + +# Generate response with precise parameter control +output = llm( + prompt, + max_tokens=200, + temperature=0.8, + top_p=0.95, + frequency_penalty=0.5, + presence_penalty=0.5, + stop=["<|im_end|>"], +) + +print(output["choices"][0]["text"]) +``` + + + + + +vLLM తో అధునాతన ఉపయోగం కోసం, మీరు InferenceClient ని ఉపయోగించవచ్చు: + +```python +from huggingface_hub import InferenceClient + +client = InferenceClient(model="http://localhost:8000/v1") + +# Advanced parameters example +response = client.chat_completion( + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, + max_tokens=200, + top_p=0.95, +) +print(response.choices[0].message.content) + +# For direct text generation +response = client.text_generation( + "Write a creative story about space exploration", + max_new_tokens=200, + temperature=0.8, + top_p=0.95, + details=True, +) +print(response.generated_text) +``` + +మీరు OpenAI client కూడా ఉపయోగించవచ్చు: + +```python +from openai import OpenAI + +client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed") + +# Advanced parameters example +response = client.chat.completions.create( + model="HuggingFaceTB/SmolLM2-360M-Instruct", + messages=[ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, + ], + temperature=0.8, + top_p=0.95, + max_tokens=200, +) +print(response.choices[0].message.content) +``` + +vLLM లో స్థానిక పైథాన్ interface కూడా ఉంది: + +```python +from vllm import LLM, SamplingParams + +# Initialize the model with advanced parameters +llm = LLM( + model="HuggingFaceTB/SmolLM2-360M-Instruct", + gpu_memory_utilization=0.85, + max_num_batched_tokens=8192, + max_num_seqs=256, + block_size=16, +) + +# Configure sampling parameters +sampling_params = SamplingParams( + temperature=0.8, # Higher for more creativity + top_p=0.95, # Consider top 95% probability mass + max_tokens=100, # Maximum length + presence_penalty=1.1, # Reduce repetition + frequency_penalty=1.1, # Reduce repetition + stop=["\n\n", "###"], # Stop sequences +) + +# Generate text +prompt = "Write a creative story" +outputs = llm.generate(prompt, sampling_params) +print(outputs[0].outputs[0].text) + +# For chat-style interactions +chat_prompt = [ + {"role": "system", "content": "You are a creative storyteller."}, + {"role": "user", "content": "Write a creative story"}, +] +formatted_prompt = llm.get_chat_template()(chat_prompt) # Uses model's chat template +outputs = llm.generate(formatted_prompt, sampling_params) +print(outputs[0].outputs[0].text) +``` + + + + + +## అధునాతన జనరేషన్ నియంత్రణ + +### Token ఎంపిక మరియు Sampling + +టెక్స్ట్‌ను జనరేట్ చేసే ప్రక్రియలో, ప్రతి దశలో వచ్చే తదుపరి token ను ఎంపిక చేయాలి. ఈ ఎంపికను పలు నియంత్రణ పరామితుల ద్వారా ప్రభావితం చేయవచ్చు: + +1. **Raw Logits**: ప్రతి token కోసం మోడల్ ఇచ్చే ప్రారంభ probability విలువలు +2. **Temperature**: యాదృచ్ఛికతను నియంత్రిస్తుంది (విలువ ఎక్కువైతే output మరింత creative గా ఉంటుంది) +3. **Top-p (Nucleus) Sampling**: మొత్తం probability లో X% వచ్చే వరకు ఉన్న అత్యుత్తమ tokens ను మాత్రమే పరిగణలోకి తీసుకోవడం +4. **Top-k Filtering**: అత్యంత సాధ్యమైన k tokens కు selection ను పరిమితం చేయడం + +ఈ పరామితులను ఎలా సెట్ చేయాలో ఇక్కడ చూపుతున్నాం: + + + + + +```python +client.generate( + "Write a creative story", + temperature=0.8, # Higher for more creativity + top_p=0.95, # Consider top 95% probability mass + top_k=50, # Consider top 50 tokens + max_new_tokens=100, # Maximum length + repetition_penalty=1.1, # Reduce repetition +) +``` + + + + + +```python +# Via OpenAI API compatibility +response = client.completions.create( + model="smollm2-1.7b-instruct", # Model name (can be any string for llama.cpp server) + prompt="Write a creative story", + temperature=0.8, # Higher for more creativity + top_p=0.95, # Consider top 95% probability mass + frequency_penalty=1.1, # Reduce repetition + presence_penalty=0.1, # Reduce repetition + max_tokens=100, # Maximum length +) + +# Via llama-cpp-python direct access +output = llm( + "Write a creative story", + temperature=0.8, + top_p=0.95, + top_k=50, + max_tokens=100, + repeat_penalty=1.1, +) +``` + + + + + +```python +params = SamplingParams( + temperature=0.8, # Higher for more creativity + top_p=0.95, # Consider top 95% probability mass + top_k=50, # Consider top 50 tokens + max_tokens=100, # Maximum length + presence_penalty=0.1, # Reduce repetition +) +llm.generate("Write a creative story", sampling_params=params) +``` + + + + + +### పునరావృతం నివారణ (Controlling Repetition) + +పునరావృతమైన లేదా ఒకే విధమైన టెక్స్ట్‌ను మోడల్ నిరంతరం ఉత్పత్తి చేయకుండా నిలువరించడానికి frameworks నియంత్రణ పద్ధతులు అందిస్తాయి: + + + + + +```python +client.generate( + "Write a varied text", + repetition_penalty=1.1, # Penalize repeated tokens + no_repeat_ngram_size=3, # Prevent 3-gram repetition +) +``` + + + + + +```python +# Via OpenAI API +response = client.completions.create( + model="smollm2-1.7b-instruct", + prompt="Write a varied text", + frequency_penalty=1.1, # Penalize frequent tokens + presence_penalty=0.8, # Penalize tokens already present +) + +# Via direct library +output = llm( + "Write a varied text", + repeat_penalty=1.1, # Penalize repeated tokens + frequency_penalty=0.5, # Additional frequency penalty + presence_penalty=0.5, # Additional presence penalty +) +``` + + + + + +```python +params = SamplingParams( + presence_penalty=0.1, # Penalize token presence + frequency_penalty=0.1, # Penalize token frequency +) +``` + + + + + +### పొడవు నియంత్రణ మరియు Stop Sequences + +జనరేట్ చేసే టెక్స్ట్ ఎంత పొడవు ఉండాలి, ఎప్పుడు generation ఆగాలి అనేదాన్ని కూడా నియంత్రించవచ్చు: + + + + + +```python +client.generate( + "Generate a short paragraph", + max_new_tokens=100, + min_new_tokens=10, + stop_sequences=["\n\n", "###"], +) +``` + + + + + +```python +# Via OpenAI API +response = client.completions.create( + model="smollm2-1.7b-instruct", + prompt="Generate a short paragraph", + max_tokens=100, + stop=["\n\n", "###"], +) + +# Via direct library +output = llm("Generate a short paragraph", max_tokens=100, stop=["\n\n", "###"]) +``` + + + + + +```python +params = SamplingParams( + max_tokens=100, + min_tokens=10, + stop=["###", "\n\n"], + ignore_eos=False, + skip_special_tokens=True, +) +``` + + + + + +## మెమరీ నిర్వహణ + +సమర్థవంతమైన inference కోసం ఈ frameworks అన్నీ అభివృద్ధి చెందిన మెమరీ మేనేజ్‌మెంట్ విధానాలను ఉపయోగిస్తాయి. + + + + + +TGI, Flash Attention 2 మరియు continuous batching ను ఉపయోగిస్తుంది: + +```sh +# Docker deployment with memory optimization +docker run --gpus all -p 8080:80 \ + --shm-size 1g \ + ghcr.io/huggingface/text-generation-inference:latest \ + --model-id HuggingFaceTB/SmolLM2-1.7B-Instruct \ + --max-batch-total-tokens 8192 \ + --max-input-length 4096 +``` + + + + + +llama.cpp లో quantization మరియు optimized memory layout వాడుతుంది: + +```sh +# Server with memory optimizations +./server \ + -m smollm2-1.7b-instruct.Q4_K_M.gguf \ + --host 0.0.0.0 \ + --port 8080 \ + -c 2048 \ # Context size + --threads 4 \ # CPU threads + --n-gpu-layers 32 \ # Use more GPU layers for larger models + --mlock \ # Lock memory to prevent swapping + --cont-batching # Enable continuous batching +``` + +మీ GPU కి చాలా పెద్దగా ఉన్న మోడళ్ల కోసం CPU offloading ను ఉపయోగించవచ్చు: + +```sh +./server \ + -m smollm2-1.7b-instruct.Q4_K_M.gguf \ + --n-gpu-layers 20 \ # Keep first 20 layers on GPU + --threads 8 # Use more CPU threads for CPU layers +``` + + + + + +vLLM, మెమరీని అత్యంత సమర్థవంతంగా నిర్వహించేందుకు PagedAttention ను ఉపయోగిస్తుంది: + +```python +from vllm.engine.arg_utils import AsyncEngineArgs + +engine_args = AsyncEngineArgs( + model="HuggingFaceTB/SmolLM2-1.7B-Instruct", + gpu_memory_utilization=0.85, + max_num_batched_tokens=8192, + block_size=16, +) + +llm = LLM(engine_args=engine_args) +``` + + + + + +## వనరులు (Resources) + +- [Text Generation Inference Documentation](https://huggingface.co/docs/text-generation-inference) +- [TGI GitHub Repository](https://github.com/huggingface/text-generation-inference) +- [vLLM Documentation](https://vllm.readthedocs.io/) +- [vLLM GitHub Repository](https://github.com/vllm-project/vllm) +- [PagedAttention Paper](https://arxiv.org/abs/2309.06180) +- [llama.cpp GitHub Repository](https://github.com/ggerganov/llama.cpp) +- [llama-cpp-python Repository](https://github.com/abetlen/llama-cpp-python) diff --git a/chapters/te/chapter2/9.mdx b/chapters/te/chapter2/9.mdx new file mode 100644 index 000000000..105832f12 --- /dev/null +++ b/chapters/te/chapter2/9.mdx @@ -0,0 +1,252 @@ + + + + +# అధ్యాయం ముగింపు క్విజ్[[end-of-chapter-quiz]] + + + +### 1. Language modeling పైప్లైన్‌లో స్టెప్స్ సరైన క్రమం ఏది? + + + +### 2. Base Transformer model output గా ఇచ్చే tensor కి ఎన్ని dimensions ఉంటాయి? అవి ఏవి? + +