Overfitted a 900KB Transformer to Compress a 100MB CSV into 7MB

I built an experiment that uses an overfitted transformer and arithmetic coding to compress individual files.

Instead of training the model to generalize, I train a 900KB transformer to memorize a single file and predict the next byte. Those predictions are fed into an arithmetic coder to produce the compressed output.

On a 100MB NYC taxi CSV, it compresses to about 7MB (~0.5 bits/byte). On a 100MB slice of enwik9, it compresses to about 21MB (~1.68 bits/byte).

It's pretty slow right now (roughly 20–30 minutes of training and 45 minutes each for compression and decompression on my AMD 7800XT).

Checkout the repo - https://github.com/samyak112/pym-particles

60 points | by spidy__ 2 days ago

13 comments

  • userbinator 1 hour ago
    Fabrice Bellard may have been the first to do this, 7 years ago: https://news.ycombinator.com/item?id=27244004
  • SubiculumCode 1 hour ago
    What do those compress to with conventional approaches? For comparison.

    I am curious. A classic machine learning ensemble approach is to overfit a collection of small models then bag them (e.g. voting) allowing the models to generalize.

    I'm sure someone's tried to overfit a bunch of transformers for compression like this, then bag them to see how well it does?

    • gwern 4 minutes ago
      Ensembling is not compute or parameter-efficient, so compression per se is a terrible application. (This is related to why people train ever larger LLMs like 1 10t-parameter LLM, rather than 100 GPT-3-scale LLMs.)
  • rtpg 22 minutes ago
    I've had this idea of building a codec that would similarly overfit to specific images. But the codec itself would not be a fixed size transformer... instead you could just mess around with the sizing to get better quality/smaller size.

    So the codec would be something like: <header describing image size + transformer layer shape> <transformer data itself>

    I've seen experiments where people have a "fixed" pipeline but I think having something more dynamic would work quite well.

  • wildstrawberry 46 minutes ago
    Three questions:

    1. How much was AI used to generate documentation for this project?

    2. The 100MB CSV data sources are not provided in the repo so it doesn't seem possible to reproduce your results. The enwik9 dataset says it is a "slice" of the larger data set, and there are many NYC taxi trip record datasets that exist. Can you provide the datasets used to generate your results?

    3. I am surprised to see performance comparisons only between your transformer and WinZIP. What were your results when comparing your transformer to more modern approaches like LZMA2 (level 9), BZIP2 and ZPAQ (max effort)?

  • tae0086 1 day ago
    Neat approach. Since the 900KB model ships with the compressed file, is there a file size below which the model overhead just eats the gains? Curious where the crossover is.
    • spidy__ 20 hours ago
      For the model overhead to become significant enough to eat into the gains, the file size would need to be fairly small, right? I assumed nobody would use this for compressing anything below 100 MB.

      I tested with 100 MB files because anything larger takes a long time to evaluate. The actual target was at least 1 GB, and in that case I would use a 100 MB model (Shannon entropy rules).

      I also tried it on a 100 MB Photoshop file and was able to compress it down to 45 MB, whereas ZIP could only get it down to 60 MB. So yeah still not losing gains.

  • 7373737373 2 days ago
    What does it compress the full 1GB file to? http://prize.hutter1.net/
    • spidy__ 2 days ago
      I tried it on a enwik9 100 mb slice and was able to compress it to 20 mb + 900kb transformer so 21mb.

      I know the top submission was able to get it to 13 mb.

      Still trying some ideas to get better compression.

      • gravypod 54 minutes ago
        Since you know the size of the file beforehand you may be able to overfit some kind of text diffusion model instead of a transformer? May allow you to partially correct the model output using some other method and then fill in the blanks that were wrong from previous generations.
    • cellular 1 hour ago
      Maybe everyone should compress the 1st 100MB worth of digits of pi, for an apples-to-apples comparison?

      Edit: oh wait that's too easy. Need to generate /publish random digits so everyone can use it.

      • saulpw 1 hour ago
        random digits aren't compressible though?
    • purple-leafy 7 hours ago
      Thanks for the link!
  • purple-leafy 1 day ago
    That’s so awesome! I want to try something similar. I’ve been going crazy with compression work. I reckon I can beat that prize link
    • spidy__ 20 hours ago
      Reallly?? So have you published something so far? Can i read something? Sounds like you got some interesting ideas.
      • purple-leafy 9 hours ago
        I will be showcasing something on hackernews soon! Basically I found a way to “compress” a multiplayer game state from ~100KB+ to ~1KB

        But it’s only for the game I’m building and it’s not pure compression work, I had to do some tricky things

        • purple-leafy 7 hours ago
          And just for comparison, my absolute best compression method managed to get down to 10s of KB, but the real unlock got to the ~1KB figures. Note these numbers are ALL post-compression numbers. This is not raw data vs compressed data. The ~100KB figure IS POST COMPRESSION.

          For context these numbers are for a grid based game where players can perform 4 actions per second, and the numbers I’m sharing are for 30 minutes of gameplay with anywhere from 2-1024+ players (human players) playing simultaneously

          So if you do the math, my compression feat is effectively ~99% compression on naive best case. And if you compare it to the raw data, it’s closing in on an even higher number than that I haven’t done the math but the raw data is another factor of 10 greater than ~100KB so the “compression” versus raw data is ~99.9%

          It sounds absolutely bullshit I know :D

          But I will be posting a blog post soon once I release the game.

          I do compression in quotes because it’s not a pure compression feat, the 99%+ feat is effectively being clever about what actually requires compression to achieve the same outcome

          • andai 59 minutes ago
            I was working on a multiplayer game a while ago, and one of the iterations of the netcode was "thin client" where clients just sent input, server simulated the game, and it dumped world state onto the pipe at 60hz. I didn't ship that version but I estimated a $3000 bandwidth bill with that approach!

            I started looking into diffing the state, compression, etc... until I realized, wait a minute! My player movement is linear so I only need a packet for start and stop! And so I achieved near infinite efficiency improvement :)

            I think the word is... a specialized solution can beat a general one.

            Also, "remembering what the program actually needs to do, and just making it do that"... I de-pessimized the netcode: https://youtube.com/watch?v=pgoetgxecw8

            • purple-leafy 5 minutes ago
              $3000 bill wow!!

              Clever insight :) yes a specialised solution usually wins! Good effort

              Did you end up publishing your game?

          • spidy__ 3 hours ago
            Sounds interesting man, soo am a bit confused maybe but can you run this on enwik9?
            • purple-leafy 1 hour ago
              Probably not lol, it’s very specific to PvP multiplayer games, tested on my own game. But maybe I can extract the core concept to enwiki9 but I doubt it
  • jocelyner 27 minutes ago
    [dead]
  • xunevega 2 days ago
    [flagged]
  • dmagog 57 minutes ago
    [flagged]
  • keynha 1 day ago
    [dead]
  • roshiya 15 hours ago
    [flagged]
  • jessedaniel 12 hours ago
    [dead]