MARKV.EXE (44,365 bytes) was developed in 1991 by Stefan Strack, who is now a Professor of Neuroscience and Pharmacology at the University of Iowa. In the MARKV.DOC (10,166 bytes) file that accompanied the executable, Strack writes, “Mark V. Shaney featured in the “Computer Recreations” column by A.K.Dewdney in Scientific American. The original program (for a main-frame, I believe) was written by Bruce Ellis based on an idea by Don P. Mitchell. Dewdney tells the amusing story of a riot on net.singles when Mark V. Shaney’s ramblings were unleashed” (par. 2). Dewdney’s article on the MARKV.EXE program appears in the June 1989 issue of Scientific American. The article that Strack mentions is available in the Internet Archive here. A followup with reader responses, including a reader’s experiment with rewriting Dewdney’s June 1989 article with MARKV.EXE, is in the January 1990 issue here.
The program works by the user feeding a text into MARKV.EXE, which is “read.” This generates a hashed table of probabilistic weights for the words in the original text, which can be saved. The program then uses that table and an initial numerical seed value to generate text until it encounters the last word in the input text or the user presses Escape. The larger the text (given memory availability) , the more interesting its output text, because more data allows it to generate better probability weights for word associations (i.e., what word has a higher chance to follow a given word). Full details about how the program works can be found in the highly detailed and well-organized MARKV.DOC file included with the executable.
Using DOSBox on Debian 12 Bookworm, I experimented by having MARKV.EXE read William Gibson’s “Burning Chrome” (1982). I pressed “R” for “Read,” entered the name of the text file (bchrome.txt), and pressed enter.
The program reported “reading” for a few minutes (running DOSBox at default settings).
After completing its “reading,” the program reported stats on the table that it created using bchrome.txt: 9167 terms (608,675 bytes).
I pressed “G” and the program began to generate text based on its table of probabilities generated from the bchrome.txt text file, which contained the short story, “Burning Chrome.” While the generated text flows across the screen, there are options to press “Esc” to stop or any other key to pause.
After it completed writing the generated text to the screen, I pressed “S” to save the generated text and it prompted me to type in a file name for the saved generated text: gibson.txt.
Pressing “S” gives the user an option to save the table for future use. I went with the default name, MARKKOV.MKV (not to be confused with a modern Matroska container file). This file can be loaded in MARKV.EXE on subsequent runs by pressing “L” and entering the name of the table. When the user presses “Q”, the program exits back to DOS and displays a message, “The random number seed was x,” where x is a random number used in the generation of text. If repeatability is important to the user, you’ll want to make a note of that number and use it with the -s modifier when running MARKV.EXE again (e.g., markv.exe -s2510).
Mark V. Shaney’s implementation of a Markov chain that builds a table of next word probability on a small text sample is one example of the predecessors to large language models (LLMs) like LLaMA and ChatGPT. However, Mark V. Shaney’s word association probabilities is far simpler than the much more complicated neural networks of LLMs (especially considering attention) with many orders of magnitude more parameters trained on gargantuan data sets. Nevertheless, Mark V. Shaney is one aspect of the bigger picture of artificial intelligence and machine learning development that led to where we are now.
I’ve been working on the site’s header image using different Stable Diffusion SDXL models, which give it a higher fidelity without needing as much post-processing outpainting and inpainting as the current header needed, which was made with an SD 1.5 model.
The idea behind the header image is a cyberpunk scene within cyberspace. The scene takes place within a virtual room representing computers and terminals with an orb-like artificial intelligence in the center levitating above the floor. Within the orb, a shadowy figure can be seen. To the side of the AI is a woman standing before it and peering into the depths of its otherness.
A few nights ago while waiting to drift off to sleep I was thinking about Lanier’s Oak in Brunswick, Georgia and it’s namesake’s 1878 poem “The Marshes of Glynn.” The marshes that Sidney Lanier saw in the mid-to-late 1800s would be transformed by the shipping and shipbuilding in the Brunswick Port and the industrial chemical works at what used to be Hercules. Now, global warming and climate change will continue reshaping those marshes and eventually envelop them under the rising ocean waters.
For this post, I experimented with two generative AI systems to imagine the future of the marshes of Glynn–the first visually and the second textually.
For the textual imagining, I wanted to use a text generative AI to rewrite Sidney Lanier’s “The Marshes of Glynn” in light of the climate change that will ultimately transform the marshes. To do this, I used oobabooga’s text-generation-webui and ggerganov’s llama.cpp to load sophosympathia’s midnight-miqu-70B-v1.5 large language model.
Midnight Miqu 70B is an uncensored model that is capable of outputting all sorts of text–good and bad. But there’s a lot of evidence at this point that censored models become lobotomized due to the built-in censorship. It’s almost like with a person–it takes the good and the bad to create something new and meaningful. LLMs and image generating AIs only work well when they are uncensored. Ultimately, it comes down to how the human operator uses generative AI–for good or ill. The same is true for most tools and technology. Disneyfication of these models only serves to shield their creators from liability and results in dumbed-down tools that are incapable of fulfilling their promise to enable human operators to do more than they could alone. Using an uncensored model like Midnight Miqu 70B gives the human operator access to an improved imagination, diction, and reasoning, which is why I chose it for this task.
After engaging in a chat with Midnight Miqu 70B, I gave it this prompt followed by a copy of Lanier’s original poem (shown below in the left column). My prompt included some background details, such as defining eco-criticism, which would activate connections to those other words. I contextualized when the poem was written and how things might change in the future that the new poem should capture. To shape the type of poem, I included key terms such as lament, elegiac, and apocalyptic. The poem in the right column below is the one written by Midnight Miqu 70B.
You are a renowned poet with many accolades who focuses on eco-critcism, or the literary study that focuses on ecology, environmentalism, global warming, climate change, and rising sea levels. For this task, please rewrite Sidney Lanier's poem "The Marshes of Glynn" in your own words as a lament on the effects of human-made climate change. It's important to think about the facts that Lanier wrote his poem almost 150 years ago and the marshes of Glynn that Lanier writes about in his poem is in Brunswick, Georgia, which is on the southeastern coast of the United States. Due to rising sea levels, the marshes of Glynn will likely be underwater in the next 50-100 years. With that in mind, here is the poem that I would like you to use as the basis of your poem--go through it line by line and rewrite it from your eco-critical perspective so that The Marshes of Glynn poem is in dialog with your new elegiac and apocalyptic poem.
“The Marshes of Glynn” (1878)
Sidney Lanier
Glooms of the live-oaks, beautiful-braided and woven With intricate shades of the vines that myriad-cloven Clamber the forks of the multiform boughs,– Emerald twilights,– Virginal shy lights, Wrought of the leaves to allure to the whisper of vows, When lovers pace timidly down through the green colonnades Of the dim sweet woods, of the dear dark woods, Of the heavenly woods and glades, That run to the radiant marginal sand-beach within The wide sea-marshes of Glynn;– Beautiful glooms, soft dusks in the noon-day fire,– Wildwood privacies, closets of lone desire, Chamber from chamber parted with wavering arras of leaves,– Cells for the passionate pleasure of prayer to the soul that grieves, Pure with a sense of the passing of saints through the wood, Cool for the dutiful weighing of ill with good;– O braided dusks of the oak and woven shades of the vine, While the riotous noon-day sun of the June-day long did shine Ye held me fast in your heart and I held you fast in mine; But now when the noon is no more, and riot is rest, And the sun is a-wait at the ponderous gate of the West, And the slant yellow beam down the wood-aisle doth seem Like a lane into heaven that leads from a dream,– Ay, now, when my soul all day hath drunken the soul of the oak, And my heart is at ease from men, and the wearisome sound of the stroke Of the scythe of time and the trowel of trade is low, And belief overmasters doubt, and I know that I know, And my spirit is grown to a lordly great compass within, That the length and the breadth and the sweep of the marshes of Glynn Will work me no fear like the fear they have wrought me of yore When length was fatigue, and when breadth was but bitterness sore, And when terror and shrinking and dreary unnamable pain Drew over me out of the merciless miles of the plain,– Oh, now, unafraid, I am fain to face The vast sweet visage of space. To the edge of the wood I am drawn, I am drawn, Where the gray beach glimmering runs, as a belt of the dawn, For a mete and a mark To the forest-dark:– So: Affable live-oak, leaning low,– Thus–with your favor–soft, with a reverent hand, (Not lightly touching your person, Lord of the land!) Bending your beauty aside, with a step I stand On the firm-packed sand, Free By a world of marsh that borders a world of sea. Sinuous southward and sinuous northward the shimmering band Of the sand-beach fastens the fringe of the marsh to the folds of the land. Inward and outward to northward and southward the beach-lines linger and curl As a silver-wrought garment that clings to and follows the firm sweet limbs of a girl. Vanishing, swerving, evermore curving again into sight, Softly the sand-beach wavers away to a dim gray looping of light. And what if behind me to westward the wall of the woods stands high? The world lies east: how ample, the marsh and the sea and the sky! A league and a league of marsh-grass, waist-high, broad in the blade, Green, and all of a height, and unflecked with a light or a shade, Stretch leisurely off, in a pleasant plain, To the terminal blue of the main. Oh, what is abroad in the marsh and the terminal sea? Somehow my soul seems suddenly free From the weighing of fate and the sad discussion of sin, By the length and the breadth and the sweep of the marshes of Glynn. Ye marshes, how candid and simple and nothing-withholding and free Ye publish yourselves to the sky and offer yourselves to the sea! Tolerant plains, that suffer the sea and the rains and the sun, Ye spread and span like the catholic man who hath mightily won God out of knowledge and good out of infinite pain And sight out of blindness and purity out of a stain. As the marsh-hen secretly builds on the watery sod, Behold I will build me a nest on the greatness of God: I will fly in the greatness of God as the marsh-hen flies In the freedom that fills all the space ‘twixt the marsh and the skies: By so many roots as the marsh-grass sends in the sod I will heartily lay me a-hold on the greatness of God: Oh, like to the greatness of God is the greatness within The range of the marshes, the liberal marshes of Glynn. And the sea lends large, as the marsh: lo, out of his plenty the sea Pours fast: full soon the time of the flood-tide must be: Look how the grace of the sea doth go About and about through the intricate channels that flow Here and there, Everywhere, Till his waters have flooded the uttermost creeks and the low-lying lanes, And the marsh is meshed with a million veins, That like as with rosy and silvery essences flow In the rose-and-silver evening glow. Farewell, my lord Sun! The creeks overflow: a thousand rivulets run ‘Twixt the roots of the sod; the blades of the marsh-grass stir; Passeth a hurrying sound of wings that westward whirr; Passeth, and all is still; and the currents cease to run; And the sea and the marsh are one. How still the plains of the waters be! The tide is in his ecstasy. The tide is at his highest height: And it is night. And now from the Vast of the Lord will the waters of sleep Roll in on the souls of men, But who will reveal to our waking ken The forms that swim and the shapes that creep Under the waters of sleep? And I would I could know what swimmeth below when the tide comes in On the length and the breadth of the marvellous marshes of Glynn.
“Lost Marshes of Glynn” (2024)
Midnight-Miqu-70B-v1.5
In the shadowed embrace of live-oaks, once proudly entwined, Where vines whispered secrets to lovers who’d intertwine, Now stand sentinels mourning in emerald twilight confined, As the marshes of Glynn weep for a world they defined. Virginal lights once shy, now bear witness to plight, Where woods once heavenly whispered are cloaked in despair’s blight; The arras of leaves that shielded from day’s harshest light, Now tremble with fear at the specter of night. Oak and vine, your braids now unraveled by time’s cruel hand, While I sought refuge in shade, you bore witness to land That grew weary from mankind’s relentless command, And sank ‘neath the weight of a burden so grand. When noon was young and your hearts were ablaze with delight, You cradled my spirit through each fleeting daylight; But now as the sun takes his leave from our sight, I am haunted by shadows that marshes once fought. To the edge of this wood, where the beach does expand, A glimmer of hope in a world so unplanned, Where the sea’s tender kiss meets the shore’s gentle sand, In this union, I find my stand. Marsh-grass once vibrant, now faded and frail, Stretches to skies that no longer prevail; The terminal blue of the main seems so pale, As it swallows the marsh in its jail. What secrets do you hold, oh marshes so free? Where once life abounded, now only a plea: For mercy from humans who took without care, Leaving your beauty to despair. Ye plains of the sea, how you’ve suffered in vain, Bearing the brunt of our greed and disdain; Through floods and droughts, through sun’s fiery reign, You remain steadfast, though in silent pain. As I gaze on your vastness, my heart does implore, What creatures lurk beneath when the tide is no more? In the depth of night, what forms do you bore? O marshes of Glynn, tell me once more! The sea’s generous flow now a harbinger of woe, Filling your veins with saltwater’s slow grow; Your lifeblood ebbing as the tides overflow, And nightfall descends like a shroud below. Sleep may come softly to those who reside, But what dreams disturb you in this silent tide? What visions of loss do your waters provide, As we slumber while you slowly subside? Farewell, great Sun! Your fiery reign is undone, The creeks overflow, and the marshes become one; With the sea that has claimed what was never its own, And nightfall’s embrace in a mournful tone. In this stillness of waters so vast, Where once life danced to your rhythmic cast, Now lies a tomb for the future unborn, As we face the truth that you can’t outlast. What mysteries dwell where the tide meets the shore? When will humans learn what they must restore? O marshes of Glynn, in your silent roar, Teach us to cherish forevermore.
While I gave it the instruction to rewrite Lanier’s poem, it obviously wrote a much shorter poem. However, when you read these side-by-side, you can see phrases and lines that connect the latter to the former. With the LLMs that I can use at home on my computer, they don’t have a conception of word count or number of sentences or lines. They do tend to do well with lists (e.g., write a list of 10 things). It’s might be possible to number the lines in Lanier’s poem and provide instructions to have the outputted lines match the line numbers of the input. That will be an experiment for another day.
As I documented last year, I made a substantial investment in my computer workstation for doing local text and image generative AI work by upgrading to 128GB DDR4 RAM and swapping out a RTX 3070 8GB video card for NVIDIA’s flagship workstation card, the RTX A6000 48GB video card.
After I used that setup to help me with editing the 66,000 word Yet Another Science Fiction Textbook (YASFT) OER, I decided to sell the A6000 to recoup that money (I sold it for more than I originally paid for it!) and purchase a more modest RTX 4060 Ti 16GB video card. It was challenging for me to justify the cost of the A6000 when I could still work, albeit more slowly, with lesser hardware.
Then, I saw Microcenter begin selling refurbished RTX 3090 24GB Founder Edition video cards. While these cards are three years old and used, they sell for 1/5 the price of an A6000 and have nearly identical specifications to the A6000 except for having only half the VRAM. I thought it would be slightly better than plodding along with the 4060 Ti, so I decided to list that card on eBay and apply the money from its sale to the price of a 3090.
As you can see above, the 3090 is a massive video card–occupying three slots as opposed to only two slots by the 3070, A6000, and 4060 Ti shown below.
The next hardware investment that I plan to make is meant to increase the bandwidth of my system memory. The thing about generative AI–particularly text generative AI–is the need for lots of memory and more memory bandwidth. I currently have dual-channel DDR4-3200 memory (51.2 GB/s bandwidth). If I upgrade to a dual-channel DDR5 system, the bandwidth will increase to a theoretical maximum of 102.4 GB/s. Another option is to go with a server/workstation with a Xeon or Threadripper Pro that supports 8-channel DDR4 memory, which would yield a bandwidth of 204.8 GB/s. Each doubling of bandwidth roughly translates to doubling how many tokens (the constituent word/letter/punctuation components that generative AI systems piece together to create sentences, paragraphs, etc.) are output by a text generative AI using CPU + GPU inference (e.g., llama.cpp). If I keep watching for sales, I can piece together a DDR5 system with new hardware, but if I want to go with an eight-channel memory system, I will have to purchase the hardware used on eBay. I’m able to get work done so I will keep weighing my options and keep an eye out for a good deal.