Altifigence Academy

23 / 24 · प्रयोग

समापन परियोजना: छोटा इन्फ़रेंस पथ और रिपोर्ट

K=9,चार आउटपुट और प्रति आउटपुट एक अतिरिक्त चक्र रखें,लेकिन तीन PE लें। कुल मॉडल चक्र और केवल-MAC स्थान उपयोग दर क्या हैं?

लक्ष्य और स्वीकृति शर्तें

पिछली प्रयोगशाला का model.mjs रखें,पास capstone-lab.mjs बनाएँ और node capstone-lab.mjs चलाएँ। एक कन्वोल्यूशन परत,बायस,पुनः क्वांटाइज़ेशन,ReLU और मैक्स पूलिंग जोड़ें। मान और लागत अलग बताएँ। पूरा वर्गीकारक या प्रशिक्षण इंजन नहीं। समर्थित स्थापित Digital Design Studio फ़ाइल कार्यप्रवाह से स्वयं फ़ाइल देख सकते हैं; DDS में निष्पादन स्थापित नहीं।

पूर्णता तब है जब सीधे कन्वोल्यूशन और patch-dot संचायक मिलें,मध्यवर्ती/आउटपुट फ़िक्स्चर मिलें और रिपोर्ट में आकार,MAC,माने चक्र,स्थान उपयोग दर तथा अद्वितीय टेंसर बाइट हों। स्वतंत्र हाथ से निकाला एक बदले-इनपुट फ़िक्स्चर जोड़ें। लॉग के साथ कमांड,फ़ाइल संस्करण और धारणाएँ रखें। विफल तुलना का कारण खोजें,केवल अपेक्षित मान न बदलें।

संदर्भ उदाहरण

इनपुट 4×4,मान 1 से 16। कर्नेल [1,0,−1;1,0,−1;1,0,−1] हर पंक्ति में बाएँ से दायाँ घटाता है। हर पंक्ति −2,हर विंडो −6। बायस आठ से चार संचायक दो। गुणक 0.5,शून्य बिंदु शून्य से कोड एक। ReLU रखता और 2×2 पूलिंग [1] देती है। असममित सीमा फ़िक्स्चर भी रखें; समान आउटपुट क्रम त्रुटि छिपा सकते हैं।

आकार [M,Ho,Wo], [1,2,2] है। शून्य-वज़न पद सहित 36 MAC गिनें। दो एकल-MAC PE हर आउटपुट रिडक्शन बाँटें तो पाँच MAC और एक संयोजन/लेखन चक्र प्रति आउटपुट मानें,ओवरलैप/स्टॉल बिना। कुल मॉडल 24 चक्र। केवल-MAC उपयोग दर 36/(4×5×2)=90%। उपकरण की मापी विलंबता नहीं।

अद्वितीय int8 टेंसर में इनपुट 16,वज़न 9,कन्वोल्यूशन आउटपुट 4 बाइट और चार-बाइट बायस। पूल आउटपुट एक बाइट। वास्तविक ट्रैफ़िक में पुनः लोड और आंशिक योग हो सकते हैं। sx=sw=1, sy=2 से गुणक 0.5 स्पष्ट है।

बायस शून्य करने से संचायक −6,कोड −3,सक्रिय शून्य और पूल शून्य अनुमान है। केवल पहला इनपुट एक से दो करने से पहला संचायक तीन,बराबरी 1.5 से दो,बाकी तीन आउटपुट एक और पूल दो। बदलाव अलग परखें। अधिक PE या शून्य वज़न छोड़ना मान रखते हुए नया स्पष्ट समयक्रम माँगता है।

चलने योग्य फ़ाइल

javascript
import assert from 'node:assert/strict';
import {conv2d, im2col, dot, requantize, maxPool2x2} from './model.mjs';
const x = [Array.from({length: 4}, (_, r) => Array.from({length: 4}, (_, c) => r * 4 + c + 1))];
const kernel = [[1, 0, -1], [1, 0, -1], [1, 0, -1]];
const weights = [[kernel]], bias = [8];
const reference = conv2d(x, weights, {bias});
const flattenedWeights = kernel.flat();
const rows = im2col(x, 3, 3);
const accumulators = rows.map(row => dot(row, flattenedWeights) + bias[0]);
assert.deepEqual(accumulators, reference[0].flat());
assert.deepEqual(accumulators, [2, 2, 2, 2]);
const activated = reference[0].map(row => row.map(v => Math.max(0, requantize(v, 0.5))));
const pooled = maxPool2x2(activated);
assert.deepEqual(activated, [[1, 1], [1, 1]]);
assert.deepEqual(pooled, [[1]]);
// Cycle estimate with explicit assumptions: all MAC operands local, no stalls,
// one output at a time, K=9, two single-MAC PEs, no overlap with output write.
const macs = rows.length * flattenedWeights.length;
const peCount = 2, macCyclesPerOutput = Math.ceil(flattenedWeights.length / peCount);
const modelCycles = rows.length * (macCyclesPerOutput + 1);
const usefulSlots = macs, scheduledSlots = rows.length * macCyclesPerOutput * peCount;
assert.equal(macs, 36);
assert.equal(modelCycles, 24);
assert.equal(usefulSlots / scheduledSlots, 0.9);
const report = {shape:[1, 2, 2], accumulators, activated, pooled, macs, peCount,
  modelCycles, macSlotUtilization:usefulSlots / scheduledSlots,
  uniqueInputBytes:16, weightBytes:9, outputBytes:4, biasBytes:4,
  scope:'Software reference and schedule estimate only; no synthesis or DDS run'};
console.log(JSON.stringify(report, null, 2));

RTL समापन परियोजना:पूर्णांक कन्वोल्यूशन

cnn_window3x3.sv और cnn_conv3x3.sv विंडो को नौ signed 8×8 गुणनफल,चिह्नयुक्त 24-बिट योग/बायस,निकटतम-सम दो से भाग,int8 संतृप्ति,ReLU और 2×2 अधिकतम से जोड़ते हैं। ज्यामिति पिछले 4×4,एक-चैनल,बिना पैडिंग valid-3×3 अनुबंध की है। इनपुट/वज़न स्केल एक,आउटपुट दो और सभी शून्य बिंदु शून्य। डिफ़ॉल्ट कर्नेल [1,0,−1;1,0,−1;1,0,−1],बायस आठ। कर्नेल पैरामीटर बदल सकते हैं;24-बिट योग सीमा फिर जाँचें।

out_row/out_col और स्वीकार आउटपुट स्थानांतरण सहित out_acc,out_code और out_activation अलग तुलना करें। चौथे परिणाम की स्वीकृति बाद done बढ़ता है;तब pooled वैध है। सोलह स्वीकार इनपुट पूर्णता नहीं बताते। RTL नौ समानांतर गुणनफल और दो रजिस्टर चरण लेता है,पहले दो-PE,24-चक्र अनुमान से अलग। आवृत्ति/शक्ति को संश्लेषण या उपकरण प्रमाण चाहिए।

साझा स्वयं-जाँच बेंच चलाएँ:

sh
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-sim

डिफ़ॉल्ट संचायक दो,कोड/सक्रियता एक और pooled एक हैं। जाँच signed सीमा,संतृप्ति,धनात्मक/ऋणात्मक बराबरी,घना signed कर्नेल,विराम और रीसेट लेती हैं। वास्तविक लॉग में PASS frames=6 windows=24 outputs=24 kernels=2 सत्यापित करें। पहला इनपुट दो करें:पहला योग तीन कोड दो राउंड और pooled दो। फिर दूसरा signed कर्नेल चुनें,पहली विंडो हाथ से निकालें,स्वतंत्र गुणांक फ़ंक्शन अपडेट करें और हर फ़िक्स्चर फिर चलाएँ। DUT परिणाम गोल्डन मॉडल में न नकल करें।

खुद आज़माएँ

K=9,चार आउटपुट और प्रति आउटपुट एक अतिरिक्त चक्र रखें,लेकिन तीन PE लें। कुल मॉडल चक्र और केवल-MAC स्थान उपयोग दर क्या हैं?

व्याख्या पढ़ें

हर आउटपुट तीन MAC और एक अतिरिक्त चक्र,कुल सोलह। सभी 36 MAC स्थान उपयोगी,100%। समान आवृत्ति,आपूर्ति और संयोजन लागत को फिर भी अलग कार्यान्वयन प्रमाण चाहिए।

Lesson files

cnn_window3x3.sv ↓cnn_conv3x3.sv ↓tb_cnn_stream.sv ↓model.mjs ↓capstone-lab.mjs ↓

आपका चयन इस ब्राउज़र पर लागू होता है। फ़ुटर से कभी भी बदलें।