Altifigence Academy

23 / 24 · Praktikum

Proyek akhir: jalur inferensi kecil dan laporan

Pertahankan K=9,empat keluaran,dan satu siklus tambahan per keluaran tetapi gunakan tiga PE. Berapa siklus model total dan utilisasi slot khusus MAC?

Tujuan dan kriteria penerimaan

Pertahankan model.mjs dari praktikum sebelumnya,buat capstone-lab.mjs di sampingnya,lalu jalankan node capstone-lab.mjs. Hubungkan satu lapisan konvolusi,bias,kuantisasi ulang,ReLU,dan max pooling. Laporkan nilai secara terpisah dari biaya. Ini bukan pengklasifikasi lengkap atau mesin pelatihan. Anda boleh memeriksa berkas secara manual melalui alur berkas Digital Design Studio terpasang yang didukung; eksekusi di dalam DDS belum dibuktikan.

Selesaikan ketika akumulator konvolusi langsung dan patch-dot cocok,fixture antara/keluaran cocok,dan laporan mencakup bentuk,MAC,siklus asumsi,utilisasi slot,serta byte tensor unik. Tambahkan satu fixture masukan berubah yang dihitung manual secara independen. Simpan perintah,versi berkas,dan asumsi bersama log. Selidiki perbandingan gagal alih-alih hanya mengedit nilai harapannya.

Contoh acuan

Masukan 4×4 berisi nilai 1 hingga 16. Kernel [1,0,−1;1,0,−1;1,0,−1] mengurangkan sampel kanan dari kiri pada setiap baris. Setiap baris memberi −2, sehingga setiap jendela berjumlah −6. Bias delapan memberi empat akumulator sama dengan dua. Pengali 0.5 dan titik nol nol menghasilkan kode satu. ReLU mempertahankannya dan pooling 2×2 memberi [1]. Pertahankan pula fixture batas asimetris; keluaran sama dapat menyembunyikan kesalahan urutan.

Bentuk [M,Ho,Wo] adalah [1,2,2]. Hitung 36 MAC, termasuk suku berbobot nol. Dengan dua PE masing-masing satu MAC yang berbagi reduksi setiap keluaran, asumsikan lima siklus MAC ditambah satu siklus penggabungan/penulisan per keluaran, tanpa tumpang tindih atau penundaan. Total model 24 siklus. Utilisasi slot khusus MAC adalah 36/(4×5×2)=90%. Ini bukan latensi perangkat yang diukur.

Tensor int8 unik menggunakan masukan 16, bobot 9, dan keluaran konvolusi 4 byte, ditambah bias empat byte. Keluaran pooling menggunakan satu byte. Lalu lintas sebenarnya dapat mencakup pemuatan ulang dan jumlah parsial. Skala sx=sw=1, sy=2 menjelaskan pengali 0.5.

Mengubah bias menjadi nol memprediksi akumulator −6, kode −3, hasil aktivasi nol, dan hasil pooling nol. Mengubah hanya masukan pertama dari satu menjadi dua memberi akumulator pertama tiga, nilai tengah 1.5 dibulatkan ke dua, tiga keluaran tersisa satu, dan hasil pooling dua. Uji perubahan secara terpisah. Lebih banyak PE atau melewati bobot nol membutuhkan jadwal eksplisit baru dengan nilai yang tetap dipertahankan.

Berkas yang dapat dijalankan

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));

Proyek akhir RTL: konvolusi bilangan bulat

Lampiran cnn_window3x3.sv dan cnn_conv3x3.sv menghubungkan jendela ke sembilan hasil perkalian 8×8 bertanda, jumlah/bias 24 bit bertanda, pembagian dua dengan pembulatan ke terdekat genap, saturasi int8, ReLU, dan maksimum 2×2. Geometrinya mengikuti kontrak sebelumnya: 4×4, satu kanal, 3×3 valid. Skala masukan/bobot satu, skala keluaran dua, dan seluruh titik nol nol. Kernel bawaan [1,0,−1;1,0,−1;1,0,−1], bias delapan. Parameter kernel dapat diubah; periksa kembali batas jumlah 24 bit.

Bandingkan out_acc, out_code, dan out_activation secara terpisah, beserta out_row/out_col dan transfer keluaran yang diterima. done naik setelah hasil keempat diterima; pooled kemudian valid. Enam belas masukan diterima tidak menyiratkan penyelesaian. RTL ini menggunakan sembilan hasil perkalian paralel dan dua tahap berregister, berbeda dari perkiraan dua PE,24 siklus sebelumnya. Frekuensi/daya membutuhkan bukti sintesis atau perangkat.

Jalankan testbench bersama yang memeriksa dirinya sendiri:

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

Akumulator bawaan bernilai dua, kode/aktivasi satu, dan keluaran pooling satu. Pemeriksaan mencakup batas bertanda, saturasi, nilai tengah positif/negatif, kernel bertanda padat, jeda, dan reset. Verifikasi PASS frames=6 windows=24 outputs=24 kernels=2 dalam log sebenarnya. Ubah masukan pertama menjadi dua: jumlah pertama tiga dibulatkan menjadi kode dua dan hasil pooling menjadi dua. Lalu pilih kernel bertanda lain, hitung jendela pertamanya secara manual, perbarui fungsi koefisien independen, dan jalankan ulang setiap fixture. Jangan salin hasil DUT ke model acuan.

Coba sendiri

Pertahankan K=9,empat keluaran,dan satu siklus tambahan per keluaran tetapi gunakan tiga PE. Berapa siklus model total dan utilisasi slot khusus MAC?

Baca penjelasan

Setiap keluaran membutuhkan tiga siklus MAC ditambah satu tambahan, sehingga total enam belas. Seluruh 36 slot MAC berguna, sehingga 100%. Frekuensi, pasokan, dan biaya penggabungan yang sama tetap membutuhkan bukti implementasi terpisah.

Lesson files

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

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.