एआई/एमएल वर्कलोडहरूको लागि जुनोसमा टेलिमेट्री
लेखिका: शालिनी मुखर्जी
परिचय
AI क्लस्टर ट्राफिकलाई उच्च थ्रुपुट र कम विलम्बताको साथ हानिरहित सञ्जालहरू चाहिने हुनाले, AI नेटवर्कको एक महत्वपूर्ण तत्व भनेको निगरानी डेटाको सङ्कलन हो। जुनोस टेलिमेट्रीले भीड व्यवस्थापन र ट्राफिक लोड सन्तुलनका लागि थ्रेसहोल्ड र काउन्टरहरू सहित प्रमुख कार्यसम्पादन सूचकहरूको दानेदार अनुगमन सक्षम गर्दछ। gRPC सत्रहरूले टेलिमेट्री डेटाको स्ट्रिमिङलाई समर्थन गर्दछ। gRPC एक आधुनिक, खुला स्रोत, उच्च प्रदर्शन ढाँचा हो जुन HTTP/2 यातायातमा निर्मित छ। यसले नेटिभ द्विदिशात्मक स्ट्रिमिङ क्षमताहरूलाई सशक्त बनाउँछ र अनुरोध हेडरहरूमा लचिलो कस्टम-मेटाडेटा समावेश गर्दछ। टेलिमेट्रीमा प्रारम्भिक चरण भनेको के डाटा सङ्कलन गर्ने हो भन्ने थाहा पाउनु हो। त्यसपछि हामी विभिन्न ढाँचाहरूमा यो डाटा विश्लेषण गर्न सक्छौं। एकपटक हामीले डाटा सङ्कलन गरेपछि, यसलाई अनुगमन गर्न, निर्णयहरू लिन र प्रस्ताव गरिएको सेवा सुधार गर्न सजिलो हुने ढाँचामा प्रस्तुत गर्नु महत्त्वपूर्ण हुन्छ। यस पेपरमा, हामी Telegraf, InfluxDB, र Grafana समावेश भएको टेलिमेट्री स्ट्याक प्रयोग गर्दछौं। यो टेलिमेट्री स्ट्याकले पुश मोडेल प्रयोग गरेर डाटा सङ्कलन गर्छ। परम्परागत पुल मोडेलहरू संसाधन-गहन हुन्छन्, म्यानुअल हस्तक्षेप चाहिन्छ, र तिनीहरूले सङ्कलन गर्ने डेटामा सूचना अन्तरहरू समावेश गर्न सक्छन्। पुश मोडेलहरूले एसिन्क्रोनस रूपमा डाटा डेलिभर गरेर यी सीमितताहरू पार गर्दछ। तिनीहरू प्रयोगकर्ता-अनुकूल प्रयोग गरेर डेटा समृद्ध बनाउँछन् tags र नामहरू। एक पटक डाटा अझ पढ्न योग्य ढाँचामा भएपछि, हामी यसलाई डेटाबेसमा भण्डार गर्छौं र यसलाई अन्तरक्रियात्मक दृश्यमा प्रयोग गर्छौं। web नेटवर्क विश्लेषण लागि आवेदन। चित्र। 1 ले हामीलाई यो स्ट्याक कसरी कुशल डाटा सङ्कलन, भण्डारण, र भिजुअलाइजेसनको लागि डिजाइन गरिएको छ भनेर देखाउँछ, नेटवर्क यन्त्रहरूबाट डाटा कलेक्टरमा पुश गर्ने डाटालाई विश्लेषणको लागि ड्यासबोर्डहरूमा प्रदर्शन गरिँदै।
TIG स्ट्याक
हामीले TIG स्ट्याक सहित सबै सफ्टवेयर स्थापना गर्न Ubuntu सर्भर प्रयोग गर्यौं।
टेलिग्राफ
डाटा सङ्कलन गर्न, हामी 22.04.2 चलिरहेको Ubuntu सर्भरमा Telegraf प्रयोग गर्छौं। यस डेमोमा चलिरहेको टेलिग्राफ संस्करण १.२८.५ हो।
Telegraf मेट्रिक्स सङ्कलन र रिपोर्टिङको लागि प्लगइन संचालित सर्भर एजेन्ट हो। यसले प्रोसेसर प्रयोग गर्दछ plugins डाटालाई समृद्ध र सामान्य बनाउन। आउटपुट plugins यो डाटा विभिन्न डाटा स्टोरहरूमा पठाउन प्रयोग गरिन्छ। यस कागजातमा हामी दुई प्रयोग गर्दछौं plugins: एउटा ओपन कन्फिग सेन्सरहरूको लागि र अर्को जुनिपर नेटिभ सेन्सरहरूको लागि।
InfluxDB
समय श्रृंखला डाटाबेसमा डाटा भण्डारण गर्न, हामी InfluxDB प्रयोग गर्छौं। Telegraf मा आउटपुट प्लगइनले डेटा InfluxDB मा पठाउँछ, जसले यसलाई उच्च प्रभावकारी रूपमा भण्डारण गर्छ। हामी V1.8 प्रयोग गर्दैछौं किनकि त्यहाँ V2 र माथिको लागि कुनै CLI अवस्थित छैन।
ग्राफाना
Grafana यो डाटा कल्पना गर्न प्रयोग गरिन्छ। Grafana ले InfluxDB बाट डाटा तान्छ र प्रयोगकर्ताहरूलाई रिच र अन्तरक्रियात्मक ड्यासबोर्डहरू सिर्जना गर्न अनुमति दिन्छ। यहाँ, हामी संस्करण 10.2.2 चलिरहेको छ।
स्विचमा कन्फिगरेसन
यो स्ट्याक कार्यान्वयन गर्न, हामीले पहिले चित्र 2 मा देखाइए अनुसार स्विच कन्फिगर गर्न आवश्यक छ। हामीले पोर्ट 50051 प्रयोग गरेका छौं। कुनै पनि पोर्ट यहाँ प्रयोग गर्न सकिन्छ। QFX स्विचमा लग इन गर्नुहोस् र निम्न कन्फिगरेसन थप्नुहोस्।
नोट: यो कन्फिगरेसन प्रयोगशाला/पीओसीहरूको लागि हो किनकि पासवर्ड स्पष्ट पाठमा पठाइन्छ। यसबाट बच्न SSL प्रयोग गर्नुहोस्।
वातावरण
Nginx
यदि तपाइँ Grafana होस्ट गरिएको पोर्ट खुलाउन असमर्थ हुनुहुन्छ भने यो आवश्यक छ। अर्को चरण भनेको रिभर्स प्रोक्सी एजेन्टको रूपमा सेवा गर्न Ubuntu सर्भरमा nginx स्थापना गर्नु हो। एक पटक nginx स्थापना भएपछि, चित्र 4 मा देखाइएको लाइनहरू "पूर्वनिर्धारित" फाइलमा थप्नुहोस् र फाइललाई /etc/nginx बाट /etc/nginx/sites-enabled मा सार्नुहोस्।
चित्र 5 मा देखाइए अनुसार nginx सेवामा पूर्ण पहुँच दिनको लागि फायरवाल समायोजन गरिएको छ भनी सुनिश्चित गर्नुहोस्।
एक पटक nginx स्थापना भएपछि र आवश्यक परिवर्तनहरू गरिसकेपछि, हामीले Grafana बाट पहुँच गर्न सक्षम हुनुपर्दछ web सबै सफ्टवेयर स्थापना भएको Ubuntu सर्भरको IP ठेगाना प्रयोग गरेर ब्राउजर।
Grafana मा एउटा सानो त्रुटि छ जसले तपाईंलाई पूर्वनिर्धारित पासवर्ड रिसेट गर्न दिँदैन। यदि तपाइँ यस मुद्दामा जानुहुन्छ भने यी चरणहरू प्रयोग गर्नुहोस्।
Grafana मा पासवर्ड सेट गर्न Ubuntu सर्भरमा प्रदर्शन गर्न चरणहरू:
- /var/lib/grafana/grafana.db मा जानुहोस्
- sqllite3 स्थापना गर्नुहोस्
o sudo apt sqlite3 स्थापना गर्नुहोस् - तपाईंको टर्मिनलमा यो आदेश चलाउनुहोस्
o sqlite3 grafana.db - Sqlite कमाण्ड प्रम्प्ट खुल्छ; निम्न क्वेरी चलाउनुहोस्:
> लगइन = 'प्रशासक' प्रयोगकर्ताबाट मेटाउनुहोस् - Grafana पुन: सुरु गर्नुहोस् र प्रयोगकर्ता नाम र पासवर्डको रूपमा व्यवस्थापक टाइप गर्नुहोस्। यसले नयाँ पासवर्डको लागि संकेत गर्दछ।
एकपटक सबै सफ्टवेयर स्थापना भएपछि, Telegraf मा कन्फिग फाइल सिर्जना गर्नुहोस् जसले टेलिमेट्री डाटालाई स्विचबाट तान्न र InfluxDB मा पुश गर्न मद्दत गर्नेछ।
Openconfig सेन्सर प्लगइन
Ubuntu सर्भरमा, सबै आवश्यक थप्न /etc/telegraf/telegraf.conf फाइल सम्पादन गर्नुहोस्। plugins र सेन्सरहरू। ओपन कन्फिग सेन्सरहरूको लागि, हामी चित्र 6 मा देखाइएको gNMI प्लगइन प्रयोग गर्छौं। डेमो उद्देश्यका लागि, होस्टनाम "स्पाइन१", पोर्ट नम्बर "५००५१" को रूपमा थप्नुहोस् जुन gRPC को लागि प्रयोग गरिन्छ, स्विचको प्रयोगकर्ता नाम र पासवर्ड, र नम्बर। असफलताको अवस्थामा पुन: डायल गर्न सेकेन्डको।
सदस्यता श्लोकमा, यो विशेष सेन्सर, सेन्सर पथ, र स्विचबाट यो डेटा समात्नको लागि समय अन्तरालको लागि एक अद्वितीय नाम, "cpu" थप्नुहोस्। सबै खुला कन्फिग सेन्सरहरूको लागि समान प्लगइन inputs.gnmi र inputs.gnmi.subscription थप्नुहोस्। (चित्र ६)
नेटिभ सेन्सर प्लगइन
यो नेटिभ सेन्सरहरूको लागि प्रयोग गरिएको जुनिपर टेलिमेट्री इन्टरफेस प्लगइन हो। उही telegraf.conf फाइलमा, नेटिभ सेन्सर प्लगइन थप्नुहोस् inputs.jti_openconfig_telemetry जहाँ फिल्डहरू लगभग openconfig जस्तै छन्। प्रत्येक सेन्सरको लागि एक अद्वितीय ग्राहक आईडी प्रयोग गर्नुहोस्; यहाँ, हामी "telegraf3" प्रयोग गर्छौं। यस सेन्सरको लागि यहाँ प्रयोग गरिएको अद्वितीय नाम हो "मेम" (चित्र 7)।
अन्तमा, InfluxDB मा यो सेन्सर डेटा पठाउन outputs.influxdb प्लगइन थप्नुहोस्। यहाँ, डाटाबेसलाई "टेलिग्राफ" नाम दिइएको छ प्रयोगकर्ताको नाम "इन्फ्लक्स" र पासवर्ड "इन्फ्लक्सडीबी" (चित्र ८)।
एकपटक तपाईंले telegraf.conf फाइल सम्पादन गरिसकेपछि, टेलिग्राफ सेवा पुन: सुरु गर्नुहोस्। अब, सबै अद्वितीय सेन्सरहरूका लागि मापनहरू सिर्जना गरिएका छन् कि छैनन् भनी सुनिश्चित गर्न InfluxDB CLI मा जाँच गर्नुहोस्। InfluxDB CLI प्रविष्ट गर्न "influx" टाइप गर्नुहोस्।
चित्रमा देखिए जस्तै। 9, influxDB प्रम्प्ट प्रविष्ट गर्नुहोस् र डाटाबेस "टेलीग्राफ" प्रयोग गर्नुहोस्। सेन्सरहरूलाई दिइएको सबै अद्वितीय नामहरू मापनको रूपमा सूचीबद्ध छन्।
कुनै एक मापनको आउटपुट हेर्नको लागि, केवल टेलिग्राफ फाइल सही छ र सेन्सरले काम गरिरहेको छ भनी सुनिश्चित गर्न, चित्र 1 मा देखाइए अनुसार "cpu limit 10 बाट चयन गर्नुहोस्" आदेश प्रयोग गर्नुहोस्।
हरेक पटक telegraf.conf फाइलमा परिवर्तनहरू गरिन्छन्, InfluxDB रोक्न, Telegraf पुन: सुरु गर्नुहोस्, र त्यसपछि InfluxDB सुरु गर्नुहोस्।
ब्राउजरबाट Grafana मा लग इन गर्नुहोस् र डाटा सही रूपमा सङ्कलन भइरहेको सुनिश्चित गरेपछि ड्यासबोर्डहरू सिर्जना गर्नुहोस्।
जडानहरूमा जानुहोस् > InfuxDB > नयाँ डेटा स्रोत थप्नुहोस्।
- यस डेटा स्रोतलाई नाम दिनुहोस्। यस डेमोमा यो "परीक्षण-१" हो।
- HTTP श्लोक अन्तर्गत, Ubuntu सर्भर IP र 8086 पोर्ट प्रयोग गर्नुहोस्।
- InfluxDB विवरणहरूमा, उही डाटाबेस नाम, "telegraf" प्रयोग गर्नुहोस् र Ubuntu सर्भरको प्रयोगकर्ता नाम र पासवर्ड प्रदान गर्नुहोस्।
- बचत र परीक्षण क्लिक गर्नुहोस्। सुनिश्चित गर्नुहोस् कि तपाईंले सन्देश देख्नुभयो, "सफल"।
- डेटा स्रोत सफलतापूर्वक थपिसकेपछि, ड्यासबोर्डमा जानुहोस् र नयाँ क्लिक गर्नुहोस्। सम्पादक मोडमा AI/ML वर्कलोडका लागि आवश्यक केही ड्यासबोर्डहरू सिर्जना गरौं।
Exampसेन्सर ग्राफहरू
निम्न पूर्व हुन्ampएआई/एमएल नेटवर्क अनुगमनका लागि आवश्यक केही प्रमुख काउन्टरहरू।
पर्सेनtagस्पाइन-१ मा इनग्रेस इन्टरफेस et-0/0/0 को लागि ई उपयोग
- परीक्षण-1 को रूपमा डाटा स्रोत चयन गर्नुहोस्।
- FROM खण्डमा, "इन्टरफेस" को रूपमा मापन चयन गर्नुहोस्। यो सेन्सर मार्गको लागि प्रयोग गरिएको अद्वितीय नाम हो।
- WHERE खण्डमा, उपकरण चयन गर्नुहोस्::tag, र मा tag मान, स्विचको होस्टनाम चयन गर्नुहोस्, त्यो हो, स्पाइन१।
- SELECT खण्डमा, सेन्सर शाखा छान्नुहोस् जुन तपाइँ निगरानी गर्न चाहानुहुन्छ; यस अवस्थामा "fild(/interfaces/interface[if_name='et-0/0/0']/state/counters/if_in_1s_octets)" छान्नुहोस्। अब उही खण्डमा, "+" मा क्लिक गर्नुहोस् र यो गणना गणित (/50000000000 * 100) थप्नुहोस्। हामी मूलतः प्रतिशत गणना गर्दैछौंtag400G इन्टरफेस को उपयोग।
- FORMAT "समय-श्रृङ्खला" हो भनी सुनिश्चित गर्नुहोस् र ALIAS खण्डमा ग्राफको नाम दिनुहोस्।
कुनै पनि लामको लागि शिखर बफर कब्जा
- परीक्षण-1 को रूपमा डाटा स्रोत चयन गर्नुहोस्।
- FROM खण्डमा, "बफर" को रूपमा मापन चयन गर्नुहोस्।
- WHERE खण्डमा, भर्नुपर्ने तीनवटा फिल्डहरू छन्। उपकरण चयन गर्नुहोस्::tag, र मा tag मान स्विचको होस्टनाम चयन गर्नुहोस् (जस्तै स्पाइन-१); र चयन गर्नुहोस् /cos/interfaces/interface/@name::tag र इन्टरफेस चयन गर्नुहोस् (जस्तै et- 0/0/0); र लाम पनि चयन गर्नुहोस्, /cos/interfaces/interface/queues/queue/@queue::tag र लाम नम्बर 4 छान्नुहोस्।
- SELECT खण्डमा, सेन्सर शाखा छान्नुहोस् जुन तपाइँ निगरानी गर्न चाहानुहुन्छ; यस अवस्थामा "फिल्ड(/cos/interfaces/interface/queues/queue/PeakBuerOccupancy)" छनौट गर्नुहोस्।
- निश्चित गर्नुहोस् कि FORMAT "समय-श्रृङ्खला" हो र ALIAS खण्डमा ग्राफको नाम दिनुहोस्।
et-17/0/0, et-0/0/0, et-1/0/0 आदि को लागी चित्र 2 मा देखिए जस्तै तपाईले एउटै ग्राफमा धेरै इन्टरफेसहरूको लागि डेटा कोलेट गर्न सक्नुहुन्छ।
PFC र ECN को अर्थ व्युत्पन्न हो
औसत व्युत्पन्न (समय दायरा भित्रको मूल्यमा भिन्नता) पत्ता लगाउनका लागि, कच्चा क्वेरी मोड प्रयोग गर्नुहोस्।
यो एक सेकेन्डमा स्पाइन-१ को et-0/0/0 मा दुई PFC मानहरू बीचको औसत व्युत्पन्न फेला पार्न प्रयोग गरिएको इन्फ्लक्स क्वेरी हो।
व्युत्पन्न चयन गर्नुहोस्(मतलब("/interfaces/interface[if_name='et-0/0/0′]/state/pfc-counter/tx_pkts"), 1s) "इन्टरफेस" कहाँबाट ("उपकरण"::tag = 'स्पाइन-१') र $timeFilter GROUP BY time($interval)
व्युत्पन्न चयन गर्नुहोस्(मतलब(“/interfaces/interface[if_name='et-0/0/8′]/state/error-counters/ecn_ce_marked_pkts”), 1s) “इन्टरफेस” कहाँबाट (“उपकरण”::tag = 'स्पाइन-१') र $timeFilter GROUP BY time($interval)
इनपुट स्रोत त्रुटिहरूको अर्थ व्युत्पन्न हो
स्रोत त्रुटिहरूको लागि कच्चा क्वेरी भनेको व्युत्पन्न हो:
व्युत्पन्न चयन गर्नुहोस्(मतलब("/interfaces/interface[if_name='et-0/0/0′]/state/error-counters/if_in_resource_errors"), 1s) "इन्टरफेस" कहाँबाट ("उपकरण"::tag = 'स्पाइन-१') र $timeFilter GROUP BY time($interval)
टेल ड्रपको अर्थ व्युत्पन्न हुन्छ
टेल ड्रपको लागि कच्चा क्वेरी भनेको व्युत्पन्न हो:
व्युत्पन्न चयन गर्नुहोस्(मतलब("/cos/interfaces/interface/queues/queue/tailDropBytes"), 1s) "बफर" कहाँबाट ("उपकरण"::tag = 'पत्ता-१' र "/cos/interfaces/interface/@name"::tag = 'et-0/0/0' र "/cos/interfaces/interface/queues/queue/@queue"::tag = '4') र $timeFilter GROUP BY time($__interval) (null)
CPU उपयोगिता
- परीक्षण-1 को रूपमा डाटा स्रोत चयन गर्नुहोस्।
- FROM खण्डमा, "newcpu" को रूपमा मापन चयन गर्नुहोस्।
- WHERE मा, भर्नका लागि तीनवटा फिल्डहरू छन्। उपकरण चयन गर्नुहोस्::tag र मा tag मानले स्विचको होस्टनाम चयन गर्नुहोस् (जस्तै स्पाइन-१)। र /components/component/properties/property/name मा:tag, र cpuutilization-कुल AND नाममा चयन गर्नुहोस्::tag RE0 चयन गर्नुहोस्।
- SELECT खण्डमा, सेन्सर शाखा छान्नुहोस् जुन तपाईंले निगरानी गर्न चाहनुहुन्छ। यस अवस्थामा, "फिल्ड (राज्य/मान)" छनौट गर्नुहोस्।
बिट्स/सेकेन्डमा धेरै इन्टरफेसहरूमा बहु स्विचहरूको लागि टेल ड्रपहरूको गैर-नकारात्मक व्युत्पन्न फेला पार्नको लागि कच्चा प्रश्न।
non_negative_derivative(mean("/cos/interfaces/interface/queues/queue/tailDropBytes"), 1s) *8 "बफर" कहाँबाट (उपकरण::) चयन गर्नुहोस्tag =~ /^स्पाइन-[१-२]$/) र (“/cos/interfaces/interface/@name”::tag =~ /et-0\/0\/[0-9]/ वा "/cos/interfaces/interface/@name"::tag=~/et-0\/0\/1[0-5]/) र $timeFilter GROUP BY time($__interval), यन्त्र::tag भर्नुहोस् (नल)
यी केही पूर्व थिएampएआई/एमएल सञ्जाल अनुगमनको लागि सिर्जना गर्न सकिने ग्राफहरू।
सारांश
यस पेपरले टेलीमेट्री डाटा तान्न र ग्राफहरू सिर्जना गरेर यसलाई दृश्य बनाउने विधिलाई चित्रण गर्दछ। यस पेपरले विशेष रूपमा AI/ML सेन्सरहरूको बारेमा कुरा गर्छ, दुबै नेटिभ र ओपन कन्फिग तर सेटअप सबै प्रकारका सेन्सरहरूको लागि प्रयोग गर्न सकिन्छ। हामीले सेटअप सिर्जना गर्दा तपाईंले सामना गर्न सक्ने धेरै समस्याहरूको समाधानहरू पनि समावेश गरेका छौं। यस पेपरमा चित्रण गरिएका चरणहरू र आउटपुटहरू पहिले उल्लेख गरिएको TIG स्ट्याकको संस्करणहरूमा निर्दिष्ट छन्। यो सफ्टवेयरको संस्करण, सेन्सर र जुनोस संस्करणको आधारमा परिवर्तनको विषय हो।
सन्दर्भहरू
जुनिपर यांग डाटा मोडेल एक्सप्लोरर सबै सेन्सर विकल्पहरूको लागि
https://apps.juniper.net/ydm-explorer/
Openconfig सेन्सरहरूको लागि Openconfig फोरम
https://www.openconfig.net/projects/models/
कर्पोरेट र बिक्री मुख्यालय
जुनिपर नेटवर्क्स, इंक।
1133 नवाचार मार्ग
Sunnyvale, CA 94089 संयुक्त राज्य अमेरिका
फोन: ८८८. जुनिपर (८८८.५८६.४७३७)
वा +1.408.745.2000
फ्याक्स: +1.408.745.2100
www.juniper.net
APAC र EMEA मुख्यालय
जुनिपर नेटवर्क अन्तर्राष्ट्रिय BV
बोइङ एभिन्यू 240
1119 PZ Schiphol-Rijk
एम्स्टर्डम, नेदरल्याण्ड
फोन: +१.६७८.८३५.४९३४
फ्याक्स: +31.207.125.701
प्रतिलिपि अधिकार 2023 जुनिपर नेटवर्क। Inc. Ail अधिकार सुरक्षित। जुनिपर नेटवर्क, जुनिपर नेटवर्क लोगो, जुनिपर, जुनोस, र अन्य ट्रेडमार्कहरू जुनिपर नेटवर्कका दर्ता ट्रेडमार्कहरू हुन्। inc। र/वा संयुक्त राज्य अमेरिका र अन्य देशहरूमा यसका सहयोगीहरू। अन्य नामहरू तिनीहरूको सम्बन्धित मालिकहरूको ट्रेडमार्क हुन सक्छ। जुनिपर नेटवर्कले यस कागजातमा कुनै पनि त्रुटिहरूको लागि कुनै जिम्मेवारी लिने छैन। जुनिपर नेटवर्कले परिवर्तन गर्ने अधिकार राख्छ। परिमार्जन गर्नुहोस्। स्थानान्तरण गर्नुहोस्, वा अन्यथा सूचना बिना यो प्रकाशन परिमार्जन गर्नुहोस्।
प्रतिक्रिया पठाउनुहोस्: design-center-comments@juniper.net V1.0/240807/ejm5-telemetry-junos-ai-ml
कागजातहरू / स्रोतहरू
![]() |
जुनिपर नेटवर्क एआई एमएल वर्कलोड सफ्टवेयरको लागि जुनोसमा टेलिमेट्री [pdf] प्रयोगकर्ता गाइड एआई एमएल वर्कलोड सफ्टवेयरका लागि जुनोसमा टेलिमेट्री, एआई एमएल वर्कलोड सफ्टवेयरका लागि जुनोस, एआई एमएल वर्कलोड सफ्टवेयर, वर्कलोड सफ्टवेयर, सफ्टवेयर |