Add OPSD frozen teacher with CPU logit cache + tests
Adds the two-phase teacher path:
* TeacherWrapper loads a HuggingFace causal LM, freezes it, and runs
forward-only. Two modes: load + pin on GPU (offload_to_cpu=false), or
wrap with deepspeed.initialize using a ZeRO-3 + offload_param=cpu
config (offload_to_cpu=true). Avoids deepspeed.zero.Init() around
from_pretrained because HF's loader partitions params to zero-width
shards before the checkpoint can fill them.
* TeacherLogitCache stages the [B, T, V] teacher logits to (pinned) host
memory in bf16, and exposes chunk_to_device() so the student-side loss
can pull sequence slices back on demand. This is the memory-economising
half of the two-phase update.
CPU-only tests cover the cache shape / dtype / round-trip / chunk-bounds
behaviour and verify the streamed-via-cache loss matches the direct
chunked loss bit-for-bit.
Signed-off-by: Zhipeng Wang <zhipengbayern@gmail.com>