Perencanaan proyek

Memilih masalah yang berat komputasinya layak dioptimasi.

Daftar isi

Modul ini mengerjakan satu proyek utuh dalam tiga tahap, dan topik ini menyiapkan tahap perencanaannya. Proyek yang dipilih adalah analisis kisi suhu ruangan, yaitu matriks suhu dengan 24 baris jam dan 8 kolom sensor. Datanya disintesis dari generator angka acak dengan seed tetap, yaitu nilai awal yang menentukan seluruh deret angka acaknya. Pembahasan mencakup kriteria masalah yang berat komputasinya layak dioptimasi, peta operasi NumPy beserta bentuk antaranya, penetapan definisi selesai yang terukur, dan uji kelayakan kecil yang dieksekusi. Setelah topik ini selesai, rencana proyek tertulis siap dipakai sebagai acuan implementasi dan laporan benchmark, yaitu pengukuran kinerja yang disusun sebagai bukti.

Kriteria masalah yang layak dioptimasi#

Tidak setiap program NumPy memerlukan optimasi, sehingga pemilihan masalah menjadi keputusan perencanaan yang pertama. Tanda-tanda masalah yang layak dirangkum menjadi tiga kriteria, yaitu data berdimensi dua yang cukup besar, operasi yang sama diulang secara seragam pada setiap baris atau kolom, dan hasil akhir yang jauh lebih kecil daripada datanya. Ketiganya berkaitan dengan cara kerja vektorisasi, yang mengganti banyak pemanggilan kecil dengan satu rangkaian operasi array, sehingga keuntungannya baru terasa apabila banyak nilai diproses dengan pola yang seragam. Perhitungan satu skalar dari data belasan elemen tidak memenuhi kriteria tersebut, dan upaya optimasinya tidak sebanding dengan hasilnya.

Proyek kisi suhu memenuhi ketiga kriteria tersebut. Datanya berbentuk (24, 8) dengan 192 sel, dan pola kodenya tidak berubah apabila ukurannya diperbesar. Operasinya berulang seragam pada tiga perhitungan, yaitu normalisasi pada setiap kolom sensor, peringkasan pada setiap baris jam, dan penghitungan jarak pada setiap pasangan sensor. Hasilnya jauh lebih kecil daripada datanya, yaitu profil ringkas berukuran 24 dan matriks jarak berukuran (8, 8), sehingga mudah dicetak dan diperiksa. Ukuran 24 dan 8 sengaja dipilih kecil agar seluruh keluaran proyek dapat ditampilkan, sedangkan laporan benchmark menguji kisi yang lebih besar untuk melihat perilakunya ketika data bertambah.

Peta operasi dan bentuk antara#

Setiap tahap dipetakan ke operasi NumPy dan bentuk antara yang terlibat sebelum kode ditulis, karena kegagalan vektorisasi lebih sering berasal dari ketidakcocokan bentuk daripada dari rumusnya. Normalisasi per sensor menghitung rata-rata dan simpangan baku per kolom dengan axis=0 dan keepdims=True, kemudian broadcasting menyebarkan hasil agregasi berbentuk (1, 8) melawan data (24, 8). Peringkasan per jam mereduksi sumbu sensor dengan axis=1, sehingga keluarannya satu nilai untuk setiap jam. Jarak antar sensor menyusun selisih seluruh pasangan profil dengan broadcasting tiga dimensi, lalu mereduksi sumbu terakhirnya menjadi satu jarak per pasangan.

Peta bentuk berikut menetapkan keluaran setiap tahap sebagai kontrak yang wajib dipenuhi implementasinya.

python
import numpy as np

JAM, SENSOR = 24, 8
rencana = {
    "data kisi suhu": (JAM, SENSOR),
    "rata-rata per sensor": (1, SENSOR),
    "simpangan per sensor": (1, SENSOR),
    "z per sensor": (JAM, SENSOR),
    "ringkasan per jam": (JAM,),
    "matriks jarak": (SENSOR, SENSOR),
}
for nama, bentuk in rencana.items():
    print(f"{nama:22} -> {bentuk}")
text Keluaran
data kisi suhu         -> (24, 8)
rata-rata per sensor   -> (1, 8)
simpangan per sensor   -> (1, 8)
z per sensor           -> (24, 8)
ringkasan per jam      -> (24,)
matriks jarak          -> (8, 8)

Rencana yang sama dirangkum sebagai alur tiga tahap pada diagram berikut, mulai dari perencanaan yang menghasilkan peta operasi dan definisi selesai, dilanjutkan implementasi yang membangun kode tervektorisasi beserta pembanding perulangannya, dan ditutup benchmark yang mengukur waktu sekaligus memverifikasi kebenaran hasil.

TAHAP 1Perencanaankriteria masalah, petaoperasi, definisi selesaiTAHAP 2Implementasikode tervektorisasi danpembanding perulanganTAHAP 3Benchmarkpengukuran waktu danverifikasi kebenaran
Alur tiga tahap proyek analisis kisi suhu

Definisi selesai yang terukur#

Definisi selesai (definition of done) adalah daftar syarat yang kebenarannya dapat diperiksa dengan perintah, bukan kesan bahwa kode sudah terlihat benar. Daftar ini ditetapkan sebelum implementasi dimulai, sehingga keputusan apakah proyek selesai tidak bergantung pada penilaian subjektif. Enam syarat proyek ini adalah sebagai berikut.

  • Data berbentuk (24, 8) dan nilainya sama pada setiap eksekusi karena dibangkitkan dari seed tetap 42.
  • Hasil normalisasi per sensor memiliki rata-rata mendekati nol dan simpangan baku mendekati satu pada setiap kolom, diperiksa dengan np.allclose.
  • Ringkasan per jam berbentuk (24,) dan matriks jarak berbentuk (8, 8).
  • Matriks jarak simetris dengan diagonal bernilai nol.
  • Versi perulangan menghasilkan nilai yang sama dengan versi tervektorisasi pada ketiga tahap, dan setiap pemeriksaan np.allclose mengembalikan True.
  • Waktu kedua versi diukur dengan metode yang sama pada data yang sama.

Lima syarat pertama menjadi baris verifikasi pada skrip implementasi hampir tanpa perubahan, sedangkan syarat keenam menjadi inti laporan benchmark. Lima syarat pertama ditulis sebagai bentuk array yang tercetak atau sebagai perbandingan yang mengembalikan boolean, sehingga seluruhnya dapat menjadi baris print pada skrip verifikasi tanpa perubahan berarti. Syarat keenam berbeda karena isinya kondisi pengukuran, bukan bentuk array atau perbandingan boolean.

Uji kelayakan kecil#

Uji kelayakan (feasibility check) adalah program sekecil mungkin yang membuktikan rencana dapat dijalankan sebelum implementasi penuh ditulis. Uji pada blok berikut membangkitkan data sesuai resep rencana, memeriksa bentuk dan rentang nilainya, serta memastikan tidak ada sensor dengan simpangan nol. Pemeriksaan terakhir penting karena normalisasi membagi setiap kolom dengan simpangannya, dan pembagian dengan nol akan menghasilkan nilai tak terhingga yang merusak tahap berikutnya.

python
import numpy as np

JAM, SENSOR = 24, 8
rng = np.random.default_rng(42)
offset = rng.uniform(-1.5, 1.5, size=SENSOR)
derau = rng.normal(0, 0.8, size=(JAM, SENSOR))
jam = np.arange(JAM)[:, np.newaxis]
suhu = np.round(22.0 + 3.0 * np.sin((jam - 6) * np.pi / 12) + offset + derau, 1)

print("bentuk:", suhu.shape, "| dtype:", suhu.dtype)
print("sampel tiga jam pertama:")
print(suhu[:3])
print("rentang seluruh data:", suhu.min(), "sampai", suhu.max())
print("simpangan per sensor:")
print(np.round(suhu.std(axis=0), 2))
print("semua simpangan tak nol:", bool((suhu.std(axis=0) > 0).all()))
text Keluaran
bentuk: (24, 8) | dtype: float64
sampel tiga jam pertama:
[[19.8 18.1 20.8 20.2 17.8 21.3 20.2 19.2]
 [20.2 18.2 20.9 19.7 17.7 20.  20.9 19.8]
 [19.9 18.9 20.9 20.3 18.5 21.2 21.9 19.9]]
rentang seluruh data: 17.1 sampai 27.4
simpangan per sensor:
[1.99 2.11 2.17 2.23 2.26 2.17 2.07 2.07]
semua simpangan tak nol: True

Keluarannya sesuai peta rencana, yaitu bentuk (24, 8) bertipe float64, dengan rentang nilai 17.1 sampai 27.4 derajat Celsius yang wajar untuk simulasi suhu ruangan. Simpangan per sensor berada pada 1.99 sampai 2.26, dan pemeriksaan terakhir mengembalikan True, sehingga risiko pembagian nol tidak ada. Resep datanya sekaligus menjadi kontrak reproduktibilitas, karena setiap blok kode pada modul ini membangkitkan ulang data yang sama dari seed yang sama. Uji ini belum merupakan implementasi proyek, tetapi cukup untuk menyatakan bahwa rencana dapat dieksekusi apa adanya.

Kesalahan umum#

Kesalahan perencanaan yang pertama adalah memilih masalah yang terlalu kecil. Pada data berukuran belasan elemen, waktu eksekusi versi tervektorisasi bahkan dapat kalah oleh overhead, yaitu biaya tetap pemanggilan fungsi yang tidak bergantung pada banyaknya data, sehingga klaim optimasi tidak dapat dibuktikan. Perbaikannya mengikuti kriteria pertama, yaitu memastikan banyaknya elemen yang diproses memadai sebelum implementasi dimulai.

Kesalahan kedua adalah membangun data sintetis tanpa seed. Tanpa seed, setiap eksekusi menghasilkan data yang berbeda, sehingga perbandingan versi perulangan dan versi tervektorisasi tidak sah karena keduanya mengolah masukan yang berbeda. Perbaikannya adalah membuat generator dengan np.random.default_rng dan angka tetap, seperti berikut.

python
import numpy as np

a = np.random.default_rng(7).normal(0, 1, size=3)
b = np.random.default_rng(7).normal(0, 1, size=3)
c = np.random.default_rng(8).normal(0, 1, size=3)
print("seed sama, data sama      :", np.array_equal(a, b))
print("seed berbeda, data berbeda:", not np.array_equal(a, c))
text Keluaran
seed sama, data sama      : True
seed berbeda, data berbeda: True

Kesalahan ketiga adalah menetapkan definisi selesai yang kualitatif, misalnya kode lebih cepat dan hasilnya benar. Pernyataan semacam itu tidak dapat diperiksa, sehingga proyek dapat dinyatakan selesai tanpa bukti apa pun. Perbaikannya adalah menuliskan setiap syarat sebagai bentuk array yang tercetak atau sebagai perbandingan yang mengembalikan True, sebagaimana enam syarat pada bagian definisi selesai.

Ringkasan#

  • Kelayakan masalah dinilai dari tiga kriteria, yaitu data dua dimensi yang cukup besar, operasi yang berulang seragam per baris atau kolom, dan hasil yang jauh lebih kecil daripada datanya.
  • Proyek modul ini adalah analisis kisi suhu (24, 8) dengan tiga perhitungan, yaitu normalisasi per sensor, ringkasan per jam, dan jarak antar sensor.
  • Peta operasi menetapkan bentuk antara setiap tahap, dan definisi selesai ditetapkan sebagai enam syarat yang dapat diperiksa.
  • Uji kelayakan yang dieksekusi membuktikan data dapat dibangkitkan dari seed 42, bentuknya sesuai, dan tidak ada simpangan nol sebelum implementasi dimulai.

Referensi#