diff --git a/studio/backend/core/training/trainer.py b/studio/backend/core/training/trainer.py index e3cabebc2a..a9d9da3978 100644 --- a/studio/backend/core/training/trainer.py +++ b/studio/backend/core/training/trainer.py @@ -3057,10 +3057,23 @@ class UnslothTrainer: logger.info("Configuring DeepSeek OCR data collator...\n") FastVisionModel.for_training(self.model) + # Honor user-selected Image Size. Keep base_size + crop_mode + # at the Gundam preset (1024 / True) so dynamic cropping of + # large documents still works. + vision_image_size = training_args.get("vision_image_size") + deepseek_image_size = ( + 640 if vision_image_size is None + else int(vision_image_size) + ) + if vision_image_size is not None: + logger.info( + f"DeepSeek OCR image resize: " + f"{deepseek_image_size} (per-crop tile size)\n" + ) data_collator = DeepSeekOCRDataCollator( tokenizer = self.tokenizer, model = self.model, - image_size = 640, + image_size = deepseek_image_size, base_size = 1024, crop_mode = True, train_on_responses_only = training_args.get( diff --git a/studio/backend/core/training/worker.py b/studio/backend/core/training/worker.py index c367527ca5..4c73759e9a 100644 --- a/studio/backend/core/training/worker.py +++ b/studio/backend/core/training/worker.py @@ -984,9 +984,10 @@ def _resize_mlx_vlm_image(image, resize): if new_size != image.size: resampling = getattr(Image, "Resampling", Image).LANCZOS image = image.resize(new_size, resampling) - # mlx-vlm's internal collator square-resizes PIL images. Return an ndarray - # so Studio's max-dimension resize is the final resize, like trainer.py. - return np.asarray(image) + # mlx-vlm's internal collator square-resizes PIL images. Return a writable + # ndarray so Studio's max-dimension resize is the final one (like + # trainer.py) and HF processors don't warn on non-writable views. + return np.array(image, copy = True) def _resize_mlx_vlm_images(value, resize):